2009-09-16 11 views
19

Sto utilizzando un evento keydown per rilevare i tasti premuti e avere diverse combinazioni di tasti per varie operazioni.Come utilizzare più tasti modificatori in C#

if (e.KeyCode == Keys.C && e.Modifiers == Keys.Control && e.Modifiers == Keys.Shift) 
{ 
    //Do work 
} 
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control) 
{ 
    //Paste 
} 

Per qualche ragione la combinazione di tasti in cui mi ha colpito Ctrl +Maiusc +C non funziona. Ho ordinato loro re, e lo mise in cima pensando che potrebbe essere interferenze da parte del Ctrl +C, e anche rimosso il Ctrl +C per vedere se stava causando un problema. Ancora non funziona. So che probabilmente è qualcosa di molto semplice, ma non riesco a capire cosa sia. Tutti i miei 1 modificatore + 1 combinazione di tasti funzionano bene, non appena aggiungo un secondo modificatore è quando non funziona più.

risposta

39
if (e.KeyCode == Keys.C && e.Modifiers == (Keys.Control | Keys.Shift)) 
{ 
    //Do work 
} 
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control) 
{ 
    //Paste 
} 
7

Hai provato e.Modifiers == (Keys.Control | Keys.Shift)?

0

Prova questo. Dovresti comportarti nel modo in cui vuoi, ed è un po 'più semplice.

if (e.Control) 
{ 
    if (e.Shift && e.KeyCode == Keys.C) 
    { 
     //Do work 
    } 
    else if (e.KeyCode == Keys.V) 
    { 
     //Paste 
    } 
} 
6

Se si desidera consentire Ctrl e Maiusc quindi utilizzare l'OR bit a bit (come Keys è un Flags enum)

if (e.KeyCode == Keys.C && e.Modifiers == (Keys.Control | Keys.Shift)) 
{ 
    //Do work (if Ctrl-Shift-C is pressed, but not if Alt is pressed as well) 
} 
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control) 
{ 
    //Paste (if Ctrl is only modifier pressed) 
} 

Questo avrà esito negativo se non si preme Alt pure

2

Un altro modo sarebbe aggiungere una voce di menu invisibile, assegnare lo Ctrl + Shift + C collegamento ad esso, e gestire l'evento lì.

1

Questo è quello che ho fatto per una Ctrl +Z Annulla e Ctrl +Maiusc +Z operazione Redo e ha funzionato.

Private Sub Form_Main_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown 
    Select Case e.KeyCode 
     Case Keys.Add 
     diagramView.ZoomIn() 
     Case Keys.Subtract 
     diagramView.ZoomOut() 
     Case Keys.Z 
     If e.Modifiers = Keys.Control + Keys.Shift Then 
      diagram.UndoManager.Redo() 
     ElseIf e.Modifiers = Keys.Control Then 
      diagram.UndoManager.Undo() 
     End If 
    End Select 
    End Sub 
2
 if ((Keyboard.Modifiers & ModifierKeys.Shift | ModifierKeys.Control) > 0) 
      Debugger.Launch(); 
0

Visto che nessun altro li menziona, sto solo andando a lasciare il suggerimento di utilizzare KeyEventArgs.KeyData:

if (e.KeyData == (Keys.C | Keys.Control | Keys.Shift) 
{ 
    //do stuff 
    //potentially use e.Handled = true 
} 
if (e.KeyData == (Keys.V | Keys.Control) 
{ 
    //do other stuff 
    //potentially use e.Handled = true 
} 

Questo dovrebbe agire solo su specifici combinazioni di tasti, anche se l'ordine dei modificatori non sembra avere importanza, il primo è sempre l'ultimo premuto.

E e.Handled = true dovrebbe interromperlo, anche se non conosco le meccaniche specifiche dietro di esso.