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