私のフォームはPreviewKeyDown
何があっても起動しません。KeyPreview
プロパティはすでに に設定されていますTrue
。
Private Sub frmMain_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles MyBase.PreviewKeyDown
'Code never hits this line
End Sub
Winforms は、.NET が登場する前の主要な GUI 開発ツールである VB6 とのある程度の下位互換性を提供する必要があるという点で、必ずしも恵まれているわけではありませんでした。KeyPreview はそのような後方互換性のあるプロパティであり、VB6 にもそのプロパティがありました。VB6 では、ショートカット キーストロークを実装する唯一の方法でした。フォーカスのあるコントロールで KeyDown イベントを発生させる前に、フォームのKeyDownイベントを発生させます。PreviewKeyDown ではありません。
VB6 の癖がいくつかあります。KeyDown は、Tab、矢印キー、Enter および Escape などのナビゲーション キーでは発生しません。これが Winforms 固有の PreviewKeyDown イベントのすべてです。ナビゲーション操作を実行する前に、そのようなキーを嗅ぐことができます。ただし、コントロールがある場合は決してフォームにならないフォーカスを持つコントロールのみ。
この後方互換機能を捨てて、キーボード処理に Winforms 固有のサポートを使用するのが確かに最善であり、驚きを減らします。ショートカット キーストロークを実装する最善の方法は、フォームの ProcessCmdKey() メソッドをオーバーライドすることです。このメソッドは、キーやフォームの状態に関係なく無条件に実行されます。
Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean
If keyData = Keys.F1 Then
'' Show help
''...
Return True
End If
Return MyBase.ProcessCmdKey(msg, keyData)
End Function