(AutoHotkey)(IMEの制御をする 編)

 やはり IMEの制御は時として重要です
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になるパターンです