vb.net Keydown event on whole form

2019-03-25 12:17发布

I have a form with several controls. I want to run a specific sub on keydown event regardless any controls event. I mean if user press Ctrl+S anywhere on form it execute a subroutine.

2条回答
男人必须洒脱
2楼-- · 2019-03-25 13:00

I've used this code in my forms before and it seems to work pretty good.

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
查看更多
时光不老,我们不散
3楼-- · 2019-03-25 13:02

You should set the KeyPreview property on the form to True and handle the keydown event there

When this property is set to true, the form will receive all KeyPress, KeyDown, and KeyUp events. After the form's event handlers have completed processing the keystroke, the keystroke is then assigned to the control with focus. .......... To handle keyboard events only at the form level and not allow controls to receive keyboard events, set the KeyPressEventArgs.Handled property in your form's KeyPress event handler to true.

So, for example, to handle the Control+S key combination you could write this event handler for the form KeyDown event.

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
查看更多
登录 后发表回答