IMEの制御

[戻る]
quoll 2007/10/26(金) 17:40:21
ケータイのような予測変換ソフトを作ろうとしてます。

ImmGetCompositionString関数を使って変換中の文字列を取得したいのですが、例えばメ
モ帳などの他のアプリの入力コンテキストがうまく取得できません。

キーフックを使って文字が入力されたらGetFoucs関数でウィンドウハンドルを取得して、
ImmGetContext関数で入力コンテキストを取得しようとやってみたのですが入力コンテキ
ストをうまく取得できませんでした。

そもそもキーフックを使うのは妥当では気がします(^^;

いい方法があればご教示お願いします。

FUKU 2007/10/27(土) 10:01:14
WH_GETMESSAGEを登録するグローバルフックDLLを作成し、
フックプロシージャ内で

if (pMsg->message == WM_IME_COMPOSITION) {
  HIMC hImc = ::ImmGetContext(pMsg->hwnd);
  ::ImmGetCompositionString(hImc, GCS_COMPSTR,,,,);
//::ImmGetCompositionString(hImc, GCS_GCS_RESULTSTR,,,,);
  ::ImmReleaseContext(pMsg->hwnd, hImc);

  // 取得した文字列をEXE側にコールバック
 〜〜〜
}

みたいな感じでどうでしょうか。

quoll 2007/10/28(日) 17:52:34
FUKUさん回答ありがとうございます。

回答していただいた方法で入力された文字列を取得できたようですが、取得した文字列を
EXE側にコールバックする方法がわかりません。

試しに取得した文字列をMessageBoxで表示してみたのですが「あ」と入力したら「あマw」
などよくわからない文字列が表示されました。1文字目だけは正しいのですが、そのあと
に意味不明な文字列が付加されてしまいます。


予測変換機能以外の処理にも使いたいので、取得した文字列ではなくウィンドウハンドル
もしくは入力コンテキストをEXE側に送りたいのですが可能なのでしょうか?

FUKU 2007/10/28(日) 23:18:06
少し試してみたところ、
コールバック関数でHWNDやHIMCをEXE側に渡しても、
EXE側でのImmGetContext()/ImmGetCompositionString()
は何故か失敗してしまうようです。

代わりに、DLLで取得した文字列をWM_COPYDATAで
EXEに渡すとうまくいきました。

例えばメモ帳を開いて「ほげ」と書くとEXE側で
----------
h
ほ
ほg
ほげ
----------
という結果を受け取ります。

> 「あ」と入力したら「あマw」
については申し訳ないですが、quollさんのコードや
開発環境が分からないので何とも言えません^^;

尚こちらの環境は
VISTA(32bit) VS2005 SP1 VC++ 
テストコードは
EXE(ダイアログアプリMFC有り)/DLL(MFC無し)
共にマルチバイト文字セット/Releaseモードです。

quoll 2007/10/30(火) 17:29:48
[[解決]]
FUKUさんありがとうございます。
WM_COPYDATAで渡すと無事に文字列を渡すことができました。

古いスレッドには追加発言できません。