2009-09-16 23 views
19

Używam zdarzenia keydown do wykrywania naciśniętych klawiszy i kilku kombinacji klawiszy dla różnych operacji.Jak używać wielu klawiszy modyfikujących w 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 
} 

Z jakiegoś powodu kombinacji klawiszy w którym uderzyłem Ctrl + Przesunięcie + C nie działa. Mam ponownie nakazał im, i umieścił go na szczycie myślenia może być ingerencja z Ctrl + C, a nawet usunięte Ctrl + C aby zobaczyć, czy to było przyczyną problemu. Nadal nie działa. Wiem, że to prawdopodobnie coś bardzo prostego, ale nie bardzo rozumiem, co to jest. Cała moja kombinacja 1 modyfikatora + 1 działa dobrze, jak tylko dodam drugi modyfikator, gdy przestanie działać.

Odpowiedz

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

Czy próbowałeś już e.Modifiers == (Keys.Control | Keys.Shift)?

0

Spróbuj tego. Powinien zachowywać się tak, jak tego chcesz, a to trochę prostsze.

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

Jeśli chcesz zezwolić Ctrl i Przesunięcie następnie użyć bitowego lub (jak Keys jest 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) 
} 

to zawiedzie, jeśli Alt jest wciśnięty, a także

2

Innym sposobem jest dodanie niewidocznej pozycji menu, przypisanie wartości Ctrl + Shift + C Skrót do niego i obsługiwać zdarzenia tam.

1

To co zrobiłem dla Ctrl + Z cofania i Ctrl + Przesunięcie + Z pracy Redo i to działało.

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

Widząc, jak nikt inny je wspomina, jestem po prostu zamiar opuścić sugestię do korzystania 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 
} 

To powinno działać tylko w określonych kombinacji klawiszy, choć kolejność modyfikatorów nie ma znaczenia, pierwszy jest zawsze ostatnim wciśniętym klawiszem.

I e.Handled = true powinno go zatrzymać, chociaż nie znam konkretnej mechaniki za nim.

Powiązane problemy