Capture function keys F1..F12 in VB.NET

32,970

Solution 1

Your code works for me with the exception that you have a typo in your EventHandler declaration. Change:

AddHandler Me.KeyDown, AddressOf KeyDownsHandler

to

AddHandler Me.KeyDown, AddressOf KeyDownHandler

alt text

Solution 2

For capturing keys (including function keys) I've started to use this pattern, which works quite well:

    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

This will automatically suppress every key you handle in the Select statement. If you want to use combinations with Shift, Alt or Ctrl you'll just have to Or them. Of course this works on a very low Form level which makes it independent from any Control you have on that form. It will also trigger weird behavior if you do not know that, like focus-jumps or badly behaving Controls.

Share:
32,970
Admin
Author by

Admin

Updated on April 28, 2020

Comments

  • Admin
    Admin about 4 years

    I cannot capture the function keys F1..F12 for my application. I am able to capture regular keys and modifiers such as shift, ctrl, alt, etc..

    This question recommends KeyPreview = True, however that does not seem to work for my application. What am I doing wrong?

    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