(AutoHotkey)(IMEの制御をする 編)
やはり IMEの制御は時として重要です
AutoHotkeyから キー入力を Sendしてみたら IMEがオンになっていて 思うように動かなかったというケースは少なくないでしょう
要は IMEを制御できればいいんですよね、 その処理を 関数化してしまいましょう
まずは あるウインドウの IMEが ONか OFFか を調べる 関数ですね
hWindow には 調べたいウインドウのハンドルを入れてください
もしも 「現在アクティブなウインドウ の IMEがONかOFFか」を調べるなら IME_IsON(WinExist("A")) という事になりますね
戻り値は 「ONの時 1」「OFFの時 0」 なので BOOL型として使えます
DefaultIMEWnd を 取得する時には DetectHiddenWindows を Onにしてないとダメのようですね
処理前の DetectHiddenWindowsの状態を一旦保存して 処理後は 元に戻しましょう、 この後に書くサンプルも この事は同じです
処理の流れとしては まず 対象のウインドウの DefaultIMEWnd を取得して その ハンドルに対して メッセージを送ります
メッセージコード は WM_IME_CONTROL、 wPalam は IMC_GETOPENSTATUS、 lPalam は 必要ないので NULL値 になります
戻り値は 上にも書いてますが IMEの状態が BOOL型で 返ってくる事になりますね
次に あるウインドウの IMEを ON OFFする 関数です
実は この後の サンプルも 基本的な形は IME_IsON と ほぼ同じです、 コピペして ちょっといじる程度の 違いしかありません
現在アクティブな ウインドウの IME を ONにする場合は IME_ON(WinExist("A"), True)、 OFFにする場合は IME_ON(WinExist("A"), False) で OKです
戻り値は 「成功時 0」「失敗時 0以外」です、 失敗時に Trueになるパターンですね 注意してください
さらに 欲しい情報としては 「かな入力」か「ローマ字入力」か とか 「全角」か「半角」か とか 「かな文字」か「英数字」などの情報ですね
これも これまでのパターンと 同じ方法で 取得・設定 が 可能です
まずは 状態の 取得からですね
戻り値は 現在の状態が帰ってきます、 状態に関しては 下の 状態一覧表 を 参照してください
取得の次は 設定になりますね、 もう このパターンにも 慣れましたよね
戻り値は 「成功時 0」「失敗時 0以外」です、 こちらも 失敗時に Trueになるパターンです
AutoHotkeyから キー入力を Sendしてみたら IMEがオンになっていて 思うように動かなかったというケースは少なくないでしょう
要は IMEを制御できればいいんですよね、 その処理を 関数化してしまいましょう
まずは あるウインドウの IMEが ONか OFFか を調べる 関数ですね
[]IME_IsON(hWindow)[] []{[] [] ; WM_IME_CONTROL = 0x0283[] [] ; IMC_GETOPENSTATUS = 0x0005[] [] bufCurrentDetectMode := A_DetectHiddenWindows[] [] DetectHiddenWindows, On[] [] buf := DllCall("user32.dll\SendMessageA", "UInt", DllCall("imm32.dll\ImmGetDefaultIMEWnd", "Uint",hWindow), "UInt", 0x0283, "Int", 0x0005, "Int", 0)[] [] DetectHiddenWindows, %bufCurrentDetectMode%[] [] Return buf[] []}[]これは 処理前のIMEの状態 を 一時的に保存しておいて 処理後に IMEの状態を 元に戻すとかに使えますね
hWindow には 調べたいウインドウのハンドルを入れてください
もしも 「現在アクティブなウインドウ の IMEがONかOFFか」を調べるなら IME_IsON(WinExist("A")) という事になりますね
戻り値は 「ONの時 1」「OFFの時 0」 なので BOOL型として使えます
DefaultIMEWnd を 取得する時には DetectHiddenWindows を Onにしてないとダメのようですね
処理前の DetectHiddenWindowsの状態を一旦保存して 処理後は 元に戻しましょう、 この後に書くサンプルも この事は同じです
処理の流れとしては まず 対象のウインドウの DefaultIMEWnd を取得して その ハンドルに対して メッセージを送ります
メッセージコード は WM_IME_CONTROL、 wPalam は IMC_GETOPENSTATUS、 lPalam は 必要ないので NULL値 になります
戻り値は 上にも書いてますが IMEの状態が BOOL型で 返ってくる事になりますね
次に あるウインドウの IMEを ON OFFする 関数です
実は この後の サンプルも 基本的な形は IME_IsON と ほぼ同じです、 コピペして ちょっといじる程度の 違いしかありません
[]IME_ON(hWindow, IsON)[] []{[] [] ; WM_IME_CONTROL = 0x0283[] [] ; IMC_SETOPENSTATUS = 0x0006[] [] bufCurrentDetectMode := A_DetectHiddenWindows[] [] DetectHiddenWindows, On[] [] buf := DllCall("user32.dll\SendMessageA", "UInt", DllCall("imm32.dll\ImmGetDefaultIMEWnd", "Uint",hWindow), "UInt", 0x0283, "Int", 0x0006, "Int", IsON)[] [] DetectHiddenWindows, %bufCurrentDetectMode%[] [] Return buf[] []}[]メッセージコード は WM_IME_CONTROL、 wPalam は IMC_SETOPENSTATUS、 lPalam は 「ONにするなら 1」「OFFにするなら 0」つまり BOOL型 で指定します
現在アクティブな ウインドウの IME を ONにする場合は IME_ON(WinExist("A"), True)、 OFFにする場合は IME_ON(WinExist("A"), False) で OKです
戻り値は 「成功時 0」「失敗時 0以外」です、 失敗時に Trueになるパターンですね 注意してください
さらに 欲しい情報としては 「かな入力」か「ローマ字入力」か とか 「全角」か「半角」か とか 「かな文字」か「英数字」などの情報ですね
これも これまでのパターンと 同じ方法で 取得・設定 が 可能です
まずは 状態の 取得からですね
[]IME_GetConversion(hWindow)[] []{[] [] ; WM_IME_CONTROL = 0x0283[] [] ; IMC_GETCONVERSIONMODE = 0x0001[] [] bufCurrentDetectMode := A_DetectHiddenWindows[] [] DetectHiddenWindows, On[] [] buf := DllCall("user32.dll\SendMessageA", "UInt", DllCall("imm32.dll\ImmGetDefaultIMEWnd", "Uint",hWindow), "UInt", 0x0283, "Int", 0x0001, "Int", 0)[] [] DetectHiddenWindows, %bufCurrentDetectMode%[] [] Return buf[] []}[]メッセージコード は WM_IME_CONTROL、 wPalam は IMC_GETCONVERSIONMODE、 lPalam は 必要ないので NULL値です
戻り値は 現在の状態が帰ってきます、 状態に関しては 下の 状態一覧表 を 参照してください
[]状態一覧表[] [] 0 = かな入力 半角英数[] [] 3 = かな入力 半角カナ[] [] 8 = かな入力 全角英数[] [] 9 = かな入力 全角ひらがな[] [] 11 = かな入力 全角カタカナ[] [] 16 = ローマ字入力 半角英数[] [] 19 = ローマ字入力 半角カタカナ[] [] 24 = ローマ字入力 全角英数[] [] 25 = ローマ字入力 全角ひらがな[] [] 27 = ローマ字入力 全角カタカナ[]
取得の次は 設定になりますね、 もう このパターンにも 慣れましたよね
[]IME_SetConversion(hWindow,ConversionMode)[] []{[] [] ; WM_IME_CONTROL = 0x0283[] [] ; IMC_SETCONVERSIONMODE = 0x0002[] [] bufCurrentDetectMode := A_DetectHiddenWindows[] [] DetectHiddenWindows, On[] [] buf := DllCall("user32.dll\SendMessageA", "UInt", DllCall("imm32.dll\ImmGetDefaultIMEWnd", "Uint",hWindow), "UInt", 0x0283, "Int", 0x0002, "Int", ConversionMode)[] [] DetectHiddenWindows, %bufCurrentDetectMode%[] [] Return buf[] []}[]メッセージコード は WM_IME_CONTROL、 wPalam は IMC_SETCONVERSIONMODE、 lPalam は 設定したい状態です 値は 上の 状態一覧表 を参照してください
戻り値は 「成功時 0」「失敗時 0以外」です、 こちらも 失敗時に Trueになるパターンです