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