evento c# keydown ctrl

evento - onkeypress c#



KeyDown: reconociendo mĂșltiples claves (9)

Desde la página de MSDN en KeyEventArgs :

if (e.KeyCode == Keys.F1 && (e.Alt || e.Control || e.Shift)) { //Do stuff... }

¿Cómo puedo determinar en KeyDown que se presionó Ctrl Up ?

private void listView1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Control && e.KeyCode == Keys.Up) { //do stuff } }

no funciona, porque nunca se presionan ambas teclas exactamente en el mismo segundo. Siempre primero al Ctrl y luego al otro ...


En KeyEventArgs hay propiedades Ctrl , Alt y Shift que muestran si se presionan estos botones.


Puede intentar usar el objeto de Keyboard para detectar la propiedad IsKeyDown . Además, si no desea que el acceso directo del navegador se anule, puede configurar la propiedad Manejada como verdadera. Pero tenga cuidado al pasar por alto los accesos directos del navegador, ya que podría causar confusión.

private void Page_KeyDown(object sender, KeyEventArgs e) { // If leftCtrl + T is pressed autofill username if (Keyboard.IsKeyDown(Key.T) && Keyboard.IsKeyDown(Key.LeftCtrl)) { txtUser.Text = "My AutoFilled UserName"; e.Handled = true; } }


Puedes probar mi código de trabajo:

private void listView1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Up) { if(e.Alt==true){ //do your stuff } } }

Utilizo este código porque no sé por qué cuando uso:

(e.Keycode == Keys>up && e.Alt==true)

no funcionó


Puedes revisar los modificadores de KeyEventArgs así:

private void listView1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Up && e.Modifiers == Keys.Control) { //do stuff } }

Referencia de MSDN


Puedes usar la propiedad ModifierKeys:

if (e.KeyCode == Keys.Up && (ModifierKeys & Keys.Control) == Keys.Control) { // CTRL + UP was pressed }

Tenga en cuenta que el valor de ModifierKeys puede ser una combinación de valores, por lo que si desea detectar que se presionó la tecla CTRL independientemente del estado de las teclas MAYÚS o ALT , deberá realizar una comparación a nivel de bits como en mi muestra anterior. Si desea asegurarse de que no se presionaron otros modificadores, debe verificar la igualdad:

if (e.KeyCode == Keys.Up && ModifierKeys == Keys.Control) { // CTRL + UP was pressed }


esto funcionará seguro Tenga cuidado al manejar el evento KeyUp y no a keyDown .

private void mainForm_KeyUp(object sender, KeyEventArgs e) { if (e.Modifiers == Keys.Control && e.KeyCode == Keys.A) { //insert here } }

Para mí, keyDown no funcionó, keyU p funcionó para el mismo código.

No sé por qué, pero parece que el evento keyDown ocurre directamente después de presionar cualquier tecla, incluso si fue ctrl , así que si presionas ctrl + arriba , presionarás la tecla ctrl antes de la tecla UP y así ocurrirá el evento antes de que pueda presionar la otra, también presionar la segunda tecla activará el evento nuevamente.

Mientras usa KeyUp , no activará el evento hasta que suelte la tecla, por lo que puede presionar ctrl , y luego presione la segunda tecla, lo que activará un evento.


tienes que recordar las teclas presionadas (es decir, en una matriz bool). y establezca la posición en 1 cuando se presiona (tecla abajo) y 0 cuando está arriba.

De esta forma puedes seguir más de una tecla. Sugiero hacer una matriz para claves especiales solamente

para que puedas hacer

if (e.KeyCode == Keys.Control) { keys[0] = true; } // could do the same with alt/shift/... - or just rename keys[0] to ctrlPressed if (keys[0] == true && e.KeyCode == Keys.Up) doyourstuff


private void listView1_KeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Up && Keyboard.IsKeyDown(Key.LeftCtrl)) { //do stuff } }

Este código solo funcionará si presiona primero LeftCtrl, luego "UP". Si el orden no tiene importancia, recomiendo que:

if ((Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))&& Keyboard.IsKeyDown(Key.Z)) { //do stuff }

En ese caso, ambos Ctrl se toman en cuenta, y no tienen importancia sobre el orden.