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