DOBON.NET DOBON.NETプログラミング掲示板過去ログ

リッチテキストボックス内でのIME制御について

環境/言語:[WindowsXP VB.NET]
分類:[.NET]

こんにちは。VB.NETでプログラム組んでます。
初めて投稿します。皆様よろしくお願いします。
あるフォームにリッチテキストボックスを設定して
テキストエディタを作成しています。
ある特殊なキー(例えば、Ctrl+↓)を押すと
リッチテキストボックス内で選択された文字を
同一フォーム内に設定したDATAGRIDに書き込みたいと考えています。

そこで、
Private Sub RichTextBox1_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles RichTextBox1.KeyDown
(特殊なキーが押されたら選択文字をDATAGRIDに書き込みする処理:省略)
End Sub
のようにしています。
しかし、この処理を実行すると、
リッチテキストボックスの中でIMEを使用して漢字入力したときに、
漢字変換されることなく確定してしまいます。
つまりキー入力したときに文字を判定してしまうので、
IMEの文字入力が確定してしまうのではないかと推定しています。
具体的には「あい」と入力すると
「あい」と入力した時点で確定してしまい、
「愛」と変換することができません。
なお、その他は正常に動作しています。

そこで質問なのですが、
IMEの漢字変換が行われている間、
キー認識イベントを回避する方法はありませんでしょうか?
また、正常に動作するような他の方法があればご教示ください。
よろしくお願いします。
> ある特殊なキー(例えば、Ctrl+↓)を押すと
> リッチテキストボックス内で選択された文字を
> 同一フォーム内に設定したDATAGRIDに書き込みたいと考えています。
> Private Sub RichTextBox1_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles RichTextBox1.KeyDown
> (特殊なキーが押されたら選択文字をDATAGRIDに書き込みする処理:省略)
> End Sub
> のようにしています。

通常はそのようにはならないと思います。
例えば、次のようなコードにすると、変換に支障は無いと思います。

If e.Control = True And e.KeyCode = Keys.Down Then
  textBox1.Text = richTextBox1.SelectedText
  e.Handled = True
End If

恐らく、省略されている、KeyDownイベントハンドラの内容に問題が
あるような気がします。

> そこで質問なのですが、
> IMEの漢字変換が行われている間、
> キー認識イベントを回避する方法はありませんでしょうか?
> また、正常に動作するような他の方法があればご教示ください。
> よろしくお願いします。

できないことはありません。
WndProcをオーバーライドして、WM_IME_COMPOSITIONとWM_IME_ENDCOMPOSITION
から変換中かどうかを判断することができます。
しかし、本質はそこではない気がします(^^;
(たいていの人がそうあって欲しいように、)IME側の処理は
コントロールのkeyDownイベントより先に働きます。

IMEでハンドルされなかった場合の、後の動作は処理内容依存ですね。
例えばメッセージボックスを表示する処理の場合、入力は確定されてしまいますし、
button1.Text="あいうえお"等といったコードの場合は、確定されません。

「IMEでハンドルされなかった場合の、」と書いたとおり、
F1やCtrl+Downやの場合と、F6〜F10等とでは振る舞いが異なります。
F6〜F10等はIME側で使用されて使用済みになり、keyDownへ行きません。
Ctrl+DownはIME側で下キーが「確定」として使用済みとされた後も、
Ctrlキーを押しているせいでkeyDownが発生します。
(その際のキー状態は当然Downキーのままなので、処理に該当してしまいます。)
F1も、IMEで機能定義されていないので、keyDownが発生します。

※IMEのキー定義により動作が異なるのは言うまでもありません。

処理を指示するキーを変えるか、
IMEより先に発生する特殊なイベントがないか調べる、の二択になるかと。
回答ありがとうございます。
お返事遅れました。投稿していただいたお二方の意見を総合すると、
キーダウンイベントが生じたときの省略されている部分に
不具合があるのでは?ということでしたので、
その動作状態を確認していました。

> 処理を指示するキーを変えるか、
> IMEより先に発生する特殊なイベントがないか調べる、の二択になるかと。


結果、Ctrl+Downキーの条件処理を除去したところ
問題を回避することができました。

具体的には、前回の投稿では省略した処理内の
If e.Shift = True Then
  Select Case e.KeyCode
  Case Keys.Down
     (処理)
Case Keys.Up
     (処理)
End Select
EndIF
という部分をコメントとして実行したところ
不具合(IMEで漢字変換されない)を生じることなく動作しました。
つまり、処理を指示するキーが悪かったみたいです。

キーを変更したいと思っています。まだ検討中ですが、、。
まだ未動作ですが、不具合発見できたので
解決ということにします。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板