IMEで入力された文字列を取得するには?

[戻る]
satokazuhisa 2005/05/19(木) 21:41:02
WinXP,VisualC++.NET MFCで

IMEで入力された文字列を確定したタイミングで捕まえて、その文字列を取得する方
法を教えてください。
メッセージの種類とコールバック関数(MFCバージョン)のサンプルがあると助かり
ます。

シャノン 2005/05/19(木) 23:56:16
WM_IME_COMPOSITION だったかな。
フリガナの取得で検索すれば、確定した文字列のフリガナを取得するサンプルが見つか
ります。
ImmGetCompositionString の引数を変えれば、確定した文字列そのものも取得できま
す。

satokazuhisa 2005/05/20(金) 10:35:38
ご指導ありがとうございます。さっそく、VC++でコールバック関数を定義しようと
しましたが、WM_IME_COMPOSITION というメッセージがありません。このような場合、
どうやってソース中にコールバック関数を定義すればよろしいのでしょうか?VCの使
い方みたいな質問になってすみません。例を挙げて説明していただけるとありがたいで
す。

シャノン 2005/05/20(金) 10:50:18
まず、imm32.h を include します。WM_IME_COMPOSITION はここで定義されています。

VC++ のウィザードは、すべてのメッセージに対応しているわけではありません。
対応していないメッセージは、手動でハンドラを書かねばなりません。
方法は MSDN で ON_MESSAGE を調べれば載っているのですが…以下サンプル。

1. ハンドラを追加したいクラスのヘッダファイルに、以下の行を追加します。

   afx_msg LRESULT OnImeComposition( WPARAM wParam, LPARAM lParam );

2. ハンドラを追加したいクラスのソースファイルの BEGIN_MESSAGE_MAP と 
  END_MESSAGE_MAP の間に、以下の行を追加します。

   ON_MESSAGE( WM_IME_COMPOSITION, OnImeComposition );

3. ハンドラを追加したいクラスのソースファイルに、OnImeComposition 関数の
  本体を書いて出来上がり。

satokazuhisa 2005/05/20(金) 18:04:04
詳細な回答ありがとうございました。おかげさまで、IME入力文字列を取得できるよ
うになりました。
ただ、このコールバック関数を定義したことにより、実行時にIME入力すると、入力
文字の2文字目以降(「あいう」と入力した場合の「いう」の文字)が画面に表示され
ないという現象になってしまいました。
試しに、コールバック関数の中身を空にしても同様の現象が起きます。
ただ、ウィンドウを再表示させるような操作をしたら、ちゃんと2文字目以降の文字列
が表示されます。
これはいったいどういうことなのでしょうか?もしご存知でしたらご教授願います。

dairygoods 2005/05/20(金) 19:43:16
コールバック関数でもともとの処理を呼び出していますか?

普通は、ハンドラの最後で、
return Default();
とすれば良いと思います。

Wakyu 2005/05/20(金) 20:36:53
>コールバック関数でもともとの処理を呼び出していますか?
>
これはどういう意味なのでしょうか?
コールバック関数の最後で、コールバックを定義していなかった場合の隠れている処理
を実行させるという意味なのでしょうか? たとえば、ダイアログのOKボタンを押し
たときに呼ばれるように定義した、OnOk()の最後でCDialog::OnOK();というステップが
あるのと同じ意味なのでしょうか?
すみません、もう少し詳しく説明していただけるとありがたいです。無知ですみませ
ん。

satokazuhisa 2005/05/21(土) 02:26:50
すみません。前発言の「Wakyu」は「satokazuhisa」の間違いですm(__)m

dairygoods 2005/05/21(土) 10:17:03
> たとえば、ダイアログのOKボタンを押し
> たときに呼ばれるように定義した、OnOk()の最後でCDialog::OnOK();というステップが
> あるのと同じ意味なのでしょうか?

同じ意味です。
ただし、今回はMFCサポート外のメッセージですので、
CDialog::OnImeComposition()といったものはありません。

satokazuhisa 2005/05/24(火) 14:02:33
[[解決]]
みなさま、いろいろ助言ありがとうございました。

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