PreviewKeyDown没有开火

时间:2013-09-21 07:59:24

标签: .net vb.net winforms

无论如何,我的表单都不会触发PreviewKeyDownKeyPreview属性已设置为True

Private Sub frmMain_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles MyBase.PreviewKeyDown
    'Code never hits this line
End Sub

1 个答案:

答案 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