Skip to content
Go back

DvorakJのIM状態取得方法の調査

· Updated:

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で直にハンドルを取りに行っても大丈夫そう。

参考文献