VB.NET中捕获功能键F1..F12

4 .net vb.net keypress .net-2.0 winforms

我无法为我的应用程序捕获功能键F1..。F12我能捕捉到正规键以及功能键,如shiftctrlalt,等。

这个问题推荐KeyPreview = True,但是这似乎不适用于我的应用程序。我究竟做错了什么?

Private Sub Main_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Me.KeyPreview = True
    AddHandler Me.KeyDown, AddressOf KeyDownsHandler
    AddHandler Me.KeyUp, AddressOf KeyUpHandler
End Sub

Private Sub KeyUpHandler(ByVal o As Object, ByVal e As KeyEventArgs)
    e.SuppressKeyPress = True
    If e.KeyCode = Keys.F1 Then
        txtMain.AppendText("F1 was pressed!" & Environment.NewLine)
    End If
    txtMain.AppendText( _
        String.Format("'{0}' '{1}' '{2}' '{3}' {4}", e.Modifiers, e.KeyValue, e.KeyData, e.KeyCode, Environment.NewLine))
End Sub

Private Sub KeyDownHandler(ByVal o As Object, ByVal e As KeyEventArgs)
    e.SuppressKeyPress = True
    txtMain.AppendText( _
        String.Format("'{0}' '{1}' '{2}' '{3}' {4}", e.Modifiers, e.KeyValue, e.KeyData, e.KeyCode, Environment.NewLine))
End Sub
Run Code Online (Sandbox Code Playgroud)

Bob*_*bby 6

为了捕获键(包括功能键),我开始使用这种模式,效果很好:

    Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean
        Select Case keyData
            Case Keys.F2
                ' Do something 

            Case Keys.F3
                ' Do more

            Case Keys.Escape
                ' Crap

            Case Else
                Return MyBase.ProcessCmdKey(msg, keyData)

        End Select

        Return True
    End Function
Run Code Online (Sandbox Code Playgroud)

这将自动抑制您在Select语句中处理的每个键。如果您想使用 Shift、Alt 或 Ctrl 的组合,您只需要使用Or它们。当然,这适用于非常低的Form级别,这使其独立于您在该表单上拥有的任何控件。如果您不知道,它也会触发奇怪的行为,例如焦点跳跃或行为不良的控件。