2009-09-16 73 views
19

Estoy usando un evento de tecla para detectar teclas presionadas y tengo varias combinaciones de teclas para varias operaciones.Cómo usar varias teclas modificadoras en 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 
} 

Por alguna razón la combinación de teclas en el que me golpeó Ctrl +Shift +C no está funcionando. He re les ordenó, y lo colocó en la parte superior pensando que podría ser la interferencia de la Ctrl +C, e incluso eliminado el Ctrl +C para ver si estaba causando un problema. Todavía no funciona. Sé que es probable que sea algo muy simple, pero no puedo comprender qué es. Todas mis combinaciones de 1 modificador + 1 funcionan bien, tan pronto como agrego un segundo modificador es cuando ya no funciona.

Respuesta

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

¿Has probado e.Modifiers == (Keys.Control | Keys.Shift)?

0

Pruebe esto. Debe comportarse de la manera que desee, y es un poco más simple.

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

Si desea permitir Ctrl y Shift continuación, utilice el operador OR (como Keys es una Flags enumeración)

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) 
} 

Esto se producirá un error si Alt se presiona así

2

Otra forma sería agregar un elemento de menú invisible, asignar Ctrl + Shift + C atajo al mismo, y manejar el evento allí.

1

Esto es lo que hice para un Ctrl +Z Deshacer y Ctrl +Shift +Z Rehacer la operación y funcionó.

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

En vista de que nadie los menciona, yo sólo voy a dejar la sugerencia de utilizar 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 
} 

Esto sólo debe actuar en combinaciones de teclas específicas, aunque el orden de los modificadores no parece importar, el primero es siempre la última tecla presionada.

Y e.Handled = true debería detenerlo, aunque no conozco la mecánica específica detrás de ello.

Cuestiones relacionadas