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