visual varias teclado tecla studio presionada lineas eventos detectar como comentar codigo code c# key keyboard-shortcuts keydown modifier-key

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();