WPF アプリケーション上で、F10 キーが押されたことを検出できない

こんにちは、Platform SDK (Windows SDK) サポートチームです。

今回は、WPF アプリケーション上で F10 のキーイベントを検出できない問題についてご案内します。

現象

Microsoft IME による日本語入力が ON の状態では、テキストを全選択してから F10 キーを押下しても、TextCompositionManager.PreviewTextInputStart イベント ハンドラーが呼び出されないケースがあります。

詳細

WPF アプリケーションにおいて、TextBox コントロールなどの日本語入力が可能なコントロールに UIElement.PreviewKeyDown イベント ハンドラーを追加すると、追加したイベント ハンドラー内で任意のキーが押されたタイミングをハンドリングすることが可能です。

ただし、Microsoft IME による日本語入力が ON の状態では、アプリケーションよりも Microsoft IME 側のキー検出が優先されます。

このため、押されたキーのシーケンスによっては、UIElement.PreviewKeyDown イベント ハンドラーが呼び出されないケースがあります。

例として、Microsoft IME による日本語入力が ON の状態で、テキストを全選択して F10 キーを押した場合は、UIElement.PreviewKeyDown イベント ハンドラーは呼び出されません。

なお、TextBox コントロールなどの日本語入力が可能なコントロールに TextCompositionManager.PreviewTextInputStart イベント ハンドラーを追加すると、日本語入力が開始されたタイミングをハンドリングすることが可能です。

この機能を利用すると、Microsoft IME による日本語入力が ON の状態であっても、TextCompositionManager.PreviewTextInputStart イベント ハンドラー内で、テキスト全選択状態で F10 キーが押されたタイミングをハンドリングすることが可能です。

ところが、テキストの選択状態やテキスト入力の開始位置、未確定文字列の変換状態によっては、テキストを全選択して F10 キーを押しても、TextCompositionManager.PreviewTextInputStart イベント ハンドラーが呼び出されないケースがあります。

原因

本現象は、WPF 内部で管理している変換文字列 (Composition) の開始位置と終了位置のオフセット値に、異常が生じていた場合に発生する問題です。

これらの WPF 内部の値に異常が生じると、本来は実行されるはずの WPF 内部の処理が実行できず、結果的に TextCompositionManager.PreviewTextInputStart イベント ハンドラー呼び出しが行われません。

代替案

以下のいずれかの代替案をご検討ください。

代替案 1.

Microsoft IME による日本語入力を OFF にした状態で、UIElement.PreviewKeyDown イベント ハンドラーで F10 キーが押されたことを検出してください。

代替案 2.

テキストを選択していない状態で、TextCompositionManager.PreviewTextInputStart イベント ハンドラーで F10 キーが押されたことを検出してください。

状況

マイクロソフトでは、この問題について調査しています。

進展があり次第、本ブログを更新予定です。