问题
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
回答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
回答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.
来源:https://stackoverflow.com/questions/4630825/capture-function-keys-f1-f12-in-vb-net