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 并没有完全幸运地必须提供与 VB6 的某种程度的向后兼容性,VB6 是 .NET 出现之前占主导地位的 GUI 开发工具。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 回答