DvorakJのAutoHotkeyスクリプトからIME状態の読み取りかたを学ぶ。ライセンスはNYSL(いわゆるパブリックドメイン)。
IME_GET(WinTitle="A") {
ControlGet,hwnd,HWND,,,%WinTitle%
if (WinActive(WinTitle)) {
ptrSize := !A_PtrSize ? 4 : A_PtrSize
VarSetCapacity(stGTI, cbSize:=4+4+(PtrSize*6)+16, 0)
NumPut(cbSize, stGTI, 0, "UInt") ; DWORD cbSize;
hwnd := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI)
? NumGet(stGTI,8+PtrSize,"UInt") : hwnd
}
return DllCall("SendMessage"
, UInt, DllCall("imm32\\ImmGetDefaultIMEWnd", Uint,hwnd)
, UInt, 0x0283 ;Message : WM_IME_CONTROL
, Int, 0x0005 ;wParam : IMC_GETOPENSTATUS
, Int, 0) ;lParam : 0
}
ControlGet:WinTitleに対応するウィンドウに関する情報を取得するWinActive(WinTitle):WinTitleに対応するウィンドウがアクティブかどうかを調べる- そのウィンドウがアクティブなら、そのキーボードフォーカスを持つウィンドウのハンドルに対象を変更する
GetGUIThreadInfo(0, ...):フォアグラウンドスレッドに関する情報を取得する。フォアグラウンドスレッドのウィンドウはキーボードフォーカスを持つので、これで取得したハンドルが使える
ImmGetDefaultIMEWnd:指定のウィンドウに対するIMEのハンドルを取得するSendMessage(..., WM_IME_CONTROL, IMC_GETOPENSTATUS, 0):IMEが有効かどうかを調べる
単にIME状態がどうなっているかだけに関心があるなら、GetGUIThreadInfoで直にハンドルを取りに行っても大丈夫そう。