dot*_*NET 3 .net vb.net winforms
PreviewKeyDown无论怎样,我的表格都不会开火.该KeyPreview物业已设置为True.
Private Sub frmMain_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles MyBase.PreviewKeyDown
'Code never hits this line
End Sub
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)