Vb.net Событие Keydown на всей форме

У меня есть форма с несколькими элементами управления. Я хочу запустить конкретный элемент на событии keydown независимо от любого события управления. Я имею в виду, если пользователь нажимает Ctrl + S в любом месте по форме, он выполняет подпрограмму.

Ответ 1

Вы должны установить свойство KeyPreview в форме True и обработать событие keydown там

Если для этого свойства установлено значение true, форма получит все KeyPress, KeyDown и KeyUp. После того, как обработчики событий формы завершена обработка нажатия клавиши, нажатие клавиши затем назначается контроль с фокусом........... Для управления клавиатурой события только на уровне формы и не позволяют элементам управления получать события клавиатуры, установите свойство KeyPressEventArgs.Handled в вашем обработчик события 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

Ответ 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