IME

Saturday, September 22, 2012

IME の変換結果を勝手に書き換えてしまうようなアプリケーションを作ろうとして頓挫した途中結果。ImmSetCompositionString がどうしても動かない。

EXPORT LRESULT CALLBACK ImeHookProc(
    int nCode, WPARAM wParam, LPARAM lParam)
{
    /* 前略 */

    // 
    if (pmsg->lParam & GCS_RESULTSTR && wParam == 1)
    {
        HWND hWndActive = GetForegroundWindow();
        HWND hIMEWnd = ImmGetDefaultIMEWnd(hWndActive);
        HIMC hImc = ImmGetContext(hIMEWnd);

        char szBuf[1024];
        memset(szBuf, '\0', sizeof szBuf);

        // これは動く
        ImmGetCompositionString(
            hImc, GCS_RESULTSTR, szBuf, sizeof szBuf);

        /* 中略 (置換処理) */

        // 動かない!
        ImmSetCompositionString(
            hImc, SCS_SETSTR, szBuf, sizeof szBuf, NULL, 0);

        ImmReleaseContext(hIMEWnd, hImc);
    }

    return CallNextHookEx(NULL, code, wParam, lParam);
}

フックプロシージャの部分はこちらを参考にさせていただいた:
http://win32.fc2web.com/win32tips/ime_kakutei.html

コメントを残す

メールアドレスが公開されることはありません。

five + five =