IMEで入力された文字列を取得するには? – プログラミング – Home

IMEで入力された文字列を取得するには...
 
通知
すべてクリア

[解決済] IMEで入力された文字列を取得するには?


satokazuhisa
 satokazuhisa
(@satokazuhisa)
ゲスト
結合: 20年前
投稿: 8
Topic starter  

WinXP,VisualC++.NET MFCで

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


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

WM_IME_COMPOSITION だったかな。
フリガナの取得で検索すれば、確定した文字列のフリガナを取得するサンプルが見つか
ります。
ImmGetCompositionString の引数を変えれば、確定した文字列そのものも取得できま
す。


返信引用
satokazuhisa
 satokazuhisa
(@satokazuhisa)
ゲスト
結合: 20年前
投稿: 8
Topic starter  

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


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

まず、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
 satokazuhisa
(@satokazuhisa)
ゲスト
結合: 20年前
投稿: 8
Topic starter  

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


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

コールバック関数でもともとの処理を呼び出していますか?

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


返信引用
Wakyu
 Wakyu
(@Wakyu)
ゲスト
結合: 20年前
投稿: 3
 

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


返信引用
satokazuhisa
 satokazuhisa
(@satokazuhisa)
ゲスト
結合: 20年前
投稿: 8
Topic starter  

すみません。前発言の「Wakyu」は「satokazuhisa」の間違いですm(__)m


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

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

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


返信引用
satokazuhisa
 satokazuhisa
(@satokazuhisa)
ゲスト
結合: 20年前
投稿: 8
Topic starter  

みなさま、いろいろ助言ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました