2012-12-10 11 views
10

Próbuję wykryć jednoczesne naciśnięcie klawiszy "Control" i "t" w VB.NET. Kod mam tak daleko jest w następujący sposób:Jak wykrywać jednoczesne naciśnięcia klawiszy, takie jak "Ctrl + T" w 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 

mogę wykryć jeden klucz lub inny usuwając oraz oświadczenie, a drugi keyvalue stwierdzenie, ale ja naprawdę nie dostać nic, gdy próbuję tego. Czy istnieje inna metoda?

Dzięki

Odpowiedz

9

Przede wszystkim And w kodzie powinny być AndAlso ponieważ jest operator logiczny. And w VB jest operatorem bitowym. Następnie można użyć Modifiers property do testowania klawiszy modyfikujących:

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 w pierwszej części warunku jest niezbędne do maskowania klawisz modyfikujący.

If e.Modifiers = Keys.Ctrl może być również zapisany jako If e.Control.

Alternatywnie, możemy zestawić te dwa pytania, prosząc bezpośrednio czy kombinacji Ctrl + T został wciśnięty:

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

w obu fragmentów wykorzystujemy bit masks.

+1

Aha, gotcha. Mam jednak jeszcze jedno pytanie. Który klucz zazwyczaj chcesz użyć do modyfikatora? Czy to nie ma znaczenia? – J2Tuner

+2

Wierzę, że 'And' w VB jest zarówno operatorem bitowym, jak i operatorem logicznym, w zależności od kontekstu. 'AndAlso' jest tylko operatorem logicznym powodującym zwarcie. – Kratz

+1

@Kratz Chociaż technicznie poprawne, jestem przekonany, że użycie 'AndAlso' wyłącznie jako warunkowego operatora sprawia, że ​​kod jest bardziej przejrzysty i mniej podatny na błędy. Uważam to za (udokumentowany) błąd kompilatora, który "nawet" działa tutaj. –

1

nie mam vb.net zainstalowano już teraz, ale spróbuj tego na keydown lub keypress imprezy:

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

'= True' nie ma sensu - zostaw to. Ponadto 'e.Control' implikuje' e.KeyCode <> Keys.T', ponieważ właściwość 'KeyCode' ma maskę bitową dla zestawu kluczy sterujących. –

2

miałem ten sam problem, ale dla mnie to do pracy musiałem ustawić formularze KeyPreview własność na true. W Visual studio możesz to zmienić w oknie właściwości Forms [Design] lub zmienić właściwość po załadowaniu.

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

    Me.KeyPreview = True 

End Sub 

następnie wykorzystać przy użyciu:

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 

lub inną logikę programu, jak przewidziano w powyższych odpowiedzi.

4

Private Sub frmMain_Zaporka_KeyDown (nadawca As Object, e jako KeyEventArgs) Uchwyty 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 

End Sub

+1

Odpowiedzi, które są samym kodem, nie stanowią ogólnej odpowiedzi. Możesz poprawić tę odpowiedź, dodając trochę kodu do twojego kodu. Zobacz dział pomocy, aby uzyskać więcej informacji: http://stackoverflow.com/help/how-to-answer – mdewitt

+0

Świetna odpowiedź! Dzięki stary – Nesar

1

cię ocalić od długiego kodu. Tutaj:

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