У меня есть форма с несколькими элементами управления. Я хочу запустить конкретный элемент на событии keydown независимо от любого события управления. Я имею в виду, если пользователь нажимает Ctrl + S в любом месте по форме, он выполняет подпрограмму.
Vb.net Событие Keydown на всей форме
Ответ 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