イベントが修飾子が設定されたキーに対するものKeyboard.Modifiers
かどうかを判断するために を使用することを示唆する多くの回答を見てきました。KeyDown
残念なことに、(キーが押されたときのモディファイアの状態ではなく) モディファイアの現在のKeyboard.Modifiers
状態を返すため、これは素早いタイピストにとって本当に厄介な断続的なバグになります。
具体的には、誰かが Ctrl+A を押し、A を押してから数ミリ秒後に Ctrl を離したとします。ここで、システムに大きな負荷がかかっていたとします。キー ハンドラは実行を開始しましたが、50 ミリ秒プリエンプトされました。キー ハンドラが再び実行されるまでに、Ctrl の現在の状態は「解放」されています。キー ハンドラーは、Ctrl キーを押さずに "A" が押されたと認識しますが、これは問題です。
同様に、速いタイピストが A、Ctrl+End を入力し、私のアプリケーションが を使用するとKeyboard.Modifiers
、代わりに Ctrl+A を観察することになる可能性があります...
WinForms では、イベントが処理されるまでに Ctrl が解放されていても、イベントはKeyDown
Ctrl の状態を正確に教えてくれます。WPFでこれと同じ動作を得るにはどうすればよいですか?
編集: Keyboard.Modifiers が実際には「現在の」修飾キーを取得しない可能性がありますが、代わりに現在処理中のキーダウン メッセージに関連する修飾キーを取得します。WinAPI では、これが「非同期」と非非同期のキー状態関数の違いでした。残念ながら、ドキュメントには「最新」が正確に何を意味するかについては言及されていません。知ってる人いたら教えてください。