PreviewKeyDown
无论如何,我的表格都不会触发。该KeyPreview
属性已设置为True
。
Private Sub frmMain_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles MyBase.PreviewKeyDown
'Code never hits this line
End Sub
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