varias - Cómo usar múltiples teclas modificadoras en C#
eventos del teclado java (8)
¿Has probado e.Modifiers == (Keys.Control | Keys.Shift)
?
Estoy usando un evento de reducción de teclas para detectar las teclas presionadas y tengo varias combinaciones de teclas para varias operaciones.
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 la que presioné Ctrl + Shift + C no está funcionando. Los reordené y los coloqué en la parte superior pensando que podría ser una interferencia de Ctrl + C , e incluso quité Ctrl + C para ver si estaba causando un problema. Todavía no funciona. Sé que es probablemente algo muy simple, pero no puedo entender lo que es. Todo mi 1 modificador + 1 combinación de teclas funciona bien, tan pronto como agrego un segundo modificador es cuando ya no funciona.
Esto es lo que hice para las operaciones Ctrl + Z Deshacer y Ctrl + Shift + Z Rehacer 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
Otra forma sería agregar un elemento de menú invisible, asignarle el acceso directo Ctrl + Shift + C y manejar el evento allí.
Prueba esto. Debería comportarse como lo desea, y es un poco más sencillo.
if (e.Control)
{
if (e.Shift && e.KeyCode == Keys.C)
{
//Do work
}
else if (e.KeyCode == Keys.V)
{
//Paste
}
}
Si desea permitir Ctrl y Shift , utilice el OR a nivel de bits (ya que Keys
es una enumeración de Flags
)
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 fallará si se presiona Alt también
Viendo que nadie más los menciona, solo voy a dejar la sugerencia de usar 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 solo debería actuar en combinaciones de teclas específicas, aunque el orden de los modificadores no parece importar, la primera siempre es la última tecla presionada.
Y e.Handled = true debería detenerlo, aunque no conozco la mecánica específica detrás de él.
if (e.KeyCode == Keys.C && e.Modifiers == (Keys.Control | Keys.Shift))
{
//Do work
}
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
//Paste
}
if ((Keyboard.Modifiers & ModifierKeys.Shift | ModifierKeys.Control) > 0)
Debugger.Launch();