Win32API Tips

■IME入力確定した文字列を取得


まず、IMEにて入力が確定されると
WM_IME_COMPOSITION
メッセージにてそれが通知されます。

これをグローバルフックして
入力が確定されたことを知ることからはじまります。

フックの方法や概念についての説明は省略しますが
SetWindowsHookEx APIを使って
WH_GETMESSAGE タイプをフックしてください。
WM_IME_COMPOSITION メッセージをフックできるはずです。

下記サンプルコードはフックプロシージャの例です。



    LRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp)
    {
        if (nCode < 0)
            return CallNextHookEx(hMyHook, nCode, wp, lp);

        MSG* pmsg = (MSG*)lp;

        // 目的のメッセージ以外は無視
        if ( pmsg->message != WM_IME_COMPOSITION )
            return 0;

        //-----------------------------
        // ここからが本番
        //-----------------------------
        // フォアグラウンドに居るWindowのハンドル取得
        HWND hwndActive = GetForegroundWindow();

        HWND hWnd = ImmGetDefaultIMEWnd( hwndActive );

        HIMC hImc = ImmGetContext(hWnd);

        //-----------------------------
        // lParamを見て、確定されたことを確認
        // 1 == wp はExcel対応(Excelでは確定時に複数回メッセージが飛ぶので)
        //-----------------------------
        if (pmsg->lParam & GCS_RESULTSTR && 1 == wp)
        {
            // 確定した文字列を取得(サイズは適当に1kほど。ほんとは事前にサイズ取得可能かも)
            char szBuf[1024];

            ::ZeroMemory( szBuf, sizeof szBuf );
            ImmGetCompositionString(hImc, GCS_RESULTSTR, szBuf, sizeof(szBuf));
        }

        // ImmGetContextしたらReleaseしないといけませんよ
        ImmReleaseContext(hWnd, hImc);

        return 0;
    }


トップ  > Win32API Tips
Copyright (C) 2005.11 By Shougo Suzaki

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送