crumbcube
@crumbcube

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

アクティブウインドウのIMEの状態判定

解決したいこと

Windows11におけるWin32プログラミング環境での質問です。
アクティブウインドウのIMEがオンかオフかを判断しようとしていますが、なぜかメモ帳がアクティブの場合に限ってその判断ができません。

発生している問題・エラー

IMEのオンとオフを繰り返しても常に0でオフ状態が返ってきます。

該当するソースコード

    HWND foreground = GetForegroundWindow();
    if (foreground == NULL) {
        return;
    }

    HWND hIMEWnd = ImmGetDefaultIMEWnd(foreground);
    if (hIMEWnd == NULL) {
        OutputDebugStringW(L"Failed to get IME window\n");
        return;
    }

    LRESULT imeStatus = SendMessageA(hIMEWnd, WM_IME_CONTROL, IMC_GETOPENSTATUS, 0);

    if (imeStatus) {
        wcscpy_s(nid.szTip, _countof(nid.szTip), L"IME: ON");
    }
    else {
        wcscpy_s(nid.szTip, _countof(nid.szTip), L"IME: OFF");
    }

自分で試したこと

ここに問題・エラーに対して試したことを記載してください。

0

1Answer

GetForegroundWindow()で取得したメモ帳の(メイン)ウィンドウハンドルから、EnumChildWindows()等で、RichEditの子ウィンドウのハンドルを取得して、そのハンドルでImmGetDefaultIMEWnd()すると、正しくIMEの状態を判定できます。

g2.png

↑スクショを例にすると、GetForegroundWindow()で取得したメモ帳の(メイン)ウィンドウハンドルは0x404D0。このハンドルでは、IMEの状態を正しく判定きない。
メモ帳の子(孫)ウィンドウの0x2060Cに対してImmGetDefaultIMEWnd()すると、正しくIMEの状態を判定できる。
(メモ帳のタブごとに、RichEditD2DPTウィンドウクラスが作られる)

0Like

Your answer might help someone💌