PreviewKeyDown没有开火

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)

Han*_*ant 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
Run Code Online (Sandbox Code Playgroud)

  • 这是一个答案的宝石。在 WinForms 应用程序中处理菜单项等的任何人都应该检查一下。 (2认同)