2012-12-10 30 views
10

Sto cercando di rilevare i tasti "Control" e "t" che vengono premuti contemporaneamente in VB.NET. Il codice che ho finora è la seguente:Come si rilevano tasti simultanei come "Ctrl + T" in 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 

posso rilevare un tasto o l'altro rimuovendo il e la dichiarazione e la seconda dichiarazione di valori-chiave, ma io in realtà non ottiene nulla quando provo questo. C'è un altro metodo?

Grazie

risposta

9

Prima di tutto, And nel codice dovrebbe essere AndAlso dal momento che è un operatore logico. And in VB è un operatore bit. Successivamente, è possibile utilizzare il Modifiers property per verificare tasti modificatori:

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

Il e.KeyCode And Not Keys.Modifiers nella prima parte della condizione è necessaria per mascherare il tasto di modifica.

If e.Modifiers = Keys.Ctrl può anche essere scritto come If e.Control.

In alternativa, possiamo dati su queste due domande, chiedendo direttamente se la combinazione Ctrl + T è stato premuto:

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

In entrambi i frammenti ci avvaliamo di bit masks.

+1

Aha, gotcha. Ho un'altra domanda però. Quale chiave tipicamente vuoi usare per il modificatore? O non importa? – J2Tuner

+2

Credo che 'E' in VB sia un operatore bit sia un operatore logico, a seconda del contesto. 'AndAlso' è solo un operatore logico in cortocircuito. – Kratz

+1

@Kratz Sebbene tecnicamente corretto, credo fermamente che l'utilizzo di 'AndAlso' esclusivamente come operatore condizionale rende il codice più chiaro e meno soggetto a errori. Lo considero un bug del compilatore (documentato) che 'And' funziona anche qui. –

1

Non ho vb.net installato in questo momento, ma provate questo sul vostro keydown o evento pressione di un tasto:

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

'= True 'non ha senso - lasciarlo fuori. Inoltre, 'e.Control' implica' e.KeyCode <> Keys.T', poiché la proprietà 'KeyCode' ha la maschera di bit per il set di chiavi di controllo. –

2

Ho avuto lo stesso problema, ma per me, per arrivare a questo lavoro ho dovuto impostare le forme KeyPreview proprietà true. In Visual Studio è possibile modificarlo nella finestra Proprietà form [Design] o modificare la proprietà al caricamento.

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

    Me.KeyPreview = True 

End Sub 

quindi utilizzare utilizzando:

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 

o altra logica di programma come previsto nelle risposte di cui sopra.

4

Private Sub frmMain_Zaporka_KeyDown (mittente come oggetto, e come KeyEventArgs) Maniglie 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

Le risposte che sono solo codice sono risposte generali non grandiose. Puoi migliorare questa risposta aggiungendo però del contesto al tuo codice. Vedi la sezione di aiuto per maggiori dettagli: http://stackoverflow.com/help/how-to-answer – mdewitt

+0

Ottima risposta! Grazie compagno – Nesar

1

io ti salverò dal codice lungo. Qui:

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