WinXP,VisualC++.NET MFCで
IMEで入力された文字列を確定したタイミングで捕まえて、その文字列を取得する方
法を教えてください。
メッセージの種類とコールバック関数(MFCバージョン)のサンプルがあると助かり
ます。
WM_IME_COMPOSITION だったかな。
フリガナの取得で検索すれば、確定した文字列のフリガナを取得するサンプルが見つか
ります。
ImmGetCompositionString の引数を変えれば、確定した文字列そのものも取得できま
す。
ご指導ありがとうございます。さっそく、VC++でコールバック関数を定義しようと
しましたが、WM_IME_COMPOSITION というメッセージがありません。このような場合、
どうやってソース中にコールバック関数を定義すればよろしいのでしょうか?VCの使
い方みたいな質問になってすみません。例を挙げて説明していただけるとありがたいで
す。
まず、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 関数の
本体を書いて出来上がり。
詳細な回答ありがとうございました。おかげさまで、IME入力文字列を取得できるよ
うになりました。
ただ、このコールバック関数を定義したことにより、実行時にIME入力すると、入力
文字の2文字目以降(「あいう」と入力した場合の「いう」の文字)が画面に表示され
ないという現象になってしまいました。
試しに、コールバック関数の中身を空にしても同様の現象が起きます。
ただ、ウィンドウを再表示させるような操作をしたら、ちゃんと2文字目以降の文字列
が表示されます。
これはいったいどういうことなのでしょうか?もしご存知でしたらご教授願います。
コールバック関数でもともとの処理を呼び出していますか?
普通は、ハンドラの最後で、
return Default();
とすれば良いと思います。
>コールバック関数でもともとの処理を呼び出していますか?
>
これはどういう意味なのでしょうか?
コールバック関数の最後で、コールバックを定義していなかった場合の隠れている処理
を実行させるという意味なのでしょうか? たとえば、ダイアログのOKボタンを押し
たときに呼ばれるように定義した、OnOk()の最後でCDialog::OnOK();というステップが
あるのと同じ意味なのでしょうか?
すみません、もう少し詳しく説明していただけるとありがたいです。無知ですみませ
ん。
すみません。前発言の「Wakyu」は「satokazuhisa」の間違いですm(__)m
> たとえば、ダイアログのOKボタンを押し
> たときに呼ばれるように定義した、OnOk()の最後でCDialog::OnOK();というステップが
> あるのと同じ意味なのでしょうか?
同じ意味です。
ただし、今回はMFCサポート外のメッセージですので、
CDialog::OnImeComposition()といったものはありません。
みなさま、いろいろ助言ありがとうございました。