我有一个包含多个控件的表单。我想在keydown事件上运行一个特定的sub,无论任何控件事件。 我的意思是如果用户在表格的任何地方按Ctrl + S,它会执行子程序。
答案 0 :(得分:17)
您应该将表单上的KeyPreview属性设置为True并在那里处理keydown事件
当此属性设置为true时,表单将接收所有KeyPress, KeyDown和KeyUp事件。表单的事件处理程序有 完成按键操作后,按键分配到 有焦点的控制。 ..........处理键盘 事件仅在表单级别,不允许控件接收 键盘事件,设置你的KeyPressEventArgs.Handled属性 form的KeyPress事件处理程序为true。
因此,例如,要处理Control + S组合键,您可以为表单KeyDown事件编写此事件处理程序。
Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles MyBase.KeyDown
If e.Control AndAlso e.KeyCode = Keys.S then
' Call your sub method here .....
YourSubToCall()
' then prevent the key to reach the current control
e.Handled = False
End If
End Sub
答案 1 :(得分:2)
我以前在我的表单中使用过这段代码,它似乎工作得很好。
Protected Overrides Function ProcessKeyPreview(ByRef m As System.Windows.Forms.Message) As Boolean
If m.Msg = &H100 Then 'WM_KEYDOWN
Dim key As Keys = m.WParam
If key = Keys.S And My.Computer.Keyboard.CtrlKeyDown Then
'DO stuff
Return True
End If
End If
Return MyBase.ProcessKeyPreview(m)
End Function