Как вы обнаруживаете одновременные нажатия клавиш, такие как "Ctrl + T" в VB.NET?

Я пытаюсь обнаружить клавиши "Control" и "t" одновременно нажатыми в VB.NET. Код, который у меня есть до сих пор, выглядит следующим образом:

Private Sub frmTimingP2P_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    If e.KeyValue = Keys.ControlKey And e.KeyValue = Keys.T Then
        MessageBox.Show("Ctrl + T")
    End If
End Sub

Я могу обнаружить один или другой ключ, удалив оператор and и второй оператор keyvalue, но я действительно ничего не получаю, когда пытаюсь это сделать. Есть ли другой способ?

Спасибо

Ответ 1

Прежде всего, And в вашем коде должен быть AndAlso, так как он является логическим оператором. And в VB - бит-оператор. Затем вы можете использовать свойство Modifiers для проверки ключей модификатора:

If (e.KeyCode And Not Keys.Modifiers) = Keys.T AndAlso e.Modifiers = Keys.Ctrl Then
    MessageBox.Show("Ctrl + T")
End If

e.KeyCode And Not Keys.Modifiers в первой части условия необходимо маскировать ключ-модификатор.

If e.Modifiers = Keys.Ctrl также может быть записано как If e.Control.

В качестве альтернативы мы можем сопоставить эти два запроса, запросив непосредственно, была ли нажата комбинация Ctrl + T:

If e.KeyCode = (Keys.T Or Keys.Ctrl) Then …

В обоих фрагментах мы используем бит-маски.

Ответ 2

Частный Sub frmMain_Zaporka_KeyDown (отправитель как объект, e As KeyEventArgs) Обрабатывает MyBase.KeyDown

Select Case e.KeyData
    Case (Keys.Control + Keys.Shift + Keys.F12)
        MsgBox("Control + Shift + F12")
    Case (Keys.Escape)
        Me.Close()
End Select

' or

If e.KeyCode = Keys.F12 AndAlso e.Modifiers = (Keys.Control Or Keys.Shift) Then
    MsgBox("Control + Shift + F12")
ElseIf e.KeyCode = Keys.Escape Then
    Me.Close()
End If

' or

Select Case e.KeyCode
    Case (Keys.F12 And e.Control And e.Shift)
        MsgBox("Control + Shift + F12")
    Case (Keys.Escape)
        Me.Close()
End Select

Конец Sub

Ответ 3

У меня была та же проблема, но для этого я должен был установить для свойства KeyPreview true. В Visual Studio вы можете изменить это в окне свойств Forms [Design] или изменить свойство при загрузке.

Private Sub frmTimingP2P_Load(ByVal sender As System.Object, ByVal e As _ 
                               System.EventArgs) Handles MyBase.Load

    Me.KeyPreview = True

End Sub

затем используйте с помощью:

Private Sub frmTimingP2P_KeyDown(ByVal Sender As Object, ByVal e As _ 
                        System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown


        If (e.KeyCode = Keys.T AndAlso e.Modifiers = Keys.Control) Then
            MessageBox.Show("Ctrl + T")
        End If

End Sub

или другой программной логики, как указано в ответах выше.

Ответ 4

У меня нет vb.net, установленного прямо сейчас, но попробуйте это в своем приложении keydown или keypress:

If e.KeyCode = Keys.T AndAlso e.Control = True Then
MsgBox("Ctrl + T")
End If

Ответ 5

Я избавлю вас от длинного кода. Здесь:

If e.Control And e.Alt And e.KeyCode = Keys.G Then
    MsgBox("Control Alt G")
End If