12

我有一个带有多个控件的表单。无论任何控件事件,我都想在 keydown 事件上运行特定的子。我的意思是,如果用户在表单上的任意位置按 Ctrl+S,它就会执行一个子例程。

4

2 回答 2

21

您应该将表单上的KeyPreview属性设置为 True 并在那里处理 keydown 事件

当此属性设置为 true 时,表单将接收所有 KeyPress、KeyDown 和 KeyUp 事件。在窗体的事件处理程序完成对击键的处理之后,击键被分配给具有焦点的控件。.......... 要仅在表单级别处理键盘事件并且不允许控件接收键盘事件,请将表单的 KeyPress 事件处理程序中的 KeyPressEventArgs.Handled 属性设置为 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
于 2012-12-05T15:55:39.327 回答
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
于 2012-12-05T16:01:25.553 回答