5

私のフォームはPreviewKeyDown何があっても起動しません。KeyPreviewプロパティはすでに に設定されていますTrue

Private Sub frmMain_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles MyBase.PreviewKeyDown
    'Code never hits this line
End Sub
4

1 に答える 1

10

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
于 2013-09-21T11:13:22.520 に答える