2009-08-12 11 views
27

¿Cómo puedo determinar en KeyDown que CtrlHasta fue presionado.KeyDown: reconocer múltiples teclas

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 que en un principio el Ctrl y luego el otro ...

Respuesta

-2

usted tiene que recordar las teclas pulsadas (es decir, en una matriz bool). y establece la posición en 1 cuando se presiona (tecla de selección) y 0 cuando está arriba.

de esta manera puede rastrear más de una tecla. Sugiero hacer una serie de teclas especiales sólo

lo que puede 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 
27

Puede comprobar los modificadores de los KeyEventArgs así:

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

MSDN reference

+3

Esto nunca es cierto en mi teclado - por ejemplo, si se presiona hacia abajo y LShiftKey Keys.Up, que e.Shift no sería cierto, y e.Modifiers permanecería siempre Ninguno. ¿Alguna idea de por qué? – Zolomon

+2

Parece que las teclas de flecha son especiales de alguna manera. Esta pregunta da una idea: http://stackoverflow.com/questions/1646998/up-down-left-and-right-arrow-keys-do-not-trigger-keydown-event –

+1

solo encuentro hay e.Key pero no e.KeyCode. Tampoco hay e.Modifier. – KMC

7

En el KeyEventArgs inmueble hay Ctrl,Alt y Shift que muestra si se pulsan estos botones.

+1

Gracias Esto funcionó perfecto! 'Si (e.control && e.KeyCode == Keys.A)' –

2

Puede utilizar la propiedad ModifierKeys:

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

Tenga en cuenta que el valor ModifierKeys puede ser una combinación de valores, por lo que si desea detectar que CTRL se presionó sin importar el estado de la SHIFT o ALT claves, tendrá que realizar una comparación bit a bit como en mi ejemplo anterior. Si desea asegurarse de que se presiona ningún otro modificador, en su lugar debe comprobar la igualdad:

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

Over [AQUÍ] (http://stackoverflow.com/a/7078186/153923), se dice que los datos están en el campo KeyData. Aquí nadie ha mencionado [KeyData] (https://msdn.microsoft.com/en-us/library/system.windows.forms.keyeventargs.keydata.aspx). ¿Estas respuestas son incorrectas? – jp2code

+0

¡Buena captura @ jp2code! 'ModifierKeys' es una propiedad en' Control' (tal como una forma formas de las ventanas) que le dará información sobre qué teclas modificadoras que están siendo presionados _currently_. 'KeyData' que viene con los eventos clave contiene información sobre qué teclas modificadoras se presionaron junto con la tecla que causó el evento. En retrospectiva, yo diría que 'ModifierKeys' es más interesante junto con el botón de clic o eventos similares, y que sería más exacto utilizar' KeyData' durante los eventos clave. –

4

Puedes probar a utilizar el objeto Keyboard para detectar la propiedad IsKeyDown. Además, si no desea que el acceso directo del navegador se anule, puede establecer la propiedad Handled en true. Pero tenga cuidado al anular los atajos 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; 
    } 
} 
+0

Nota: Esto es WPF. – TaW

+1

@TaW: estamos ejecutando una aplicación XBAP (WPF se ejecuta en Internet Explorer). Entonces, en ese caso, aún necesita usar el trazo de la tecla, ya que 'Handled' o IE lo recogerá. XBAP no es un framework ampliamente utilizado, pero pensé que te dejaría saber por qué estaba discutiendo el manejo de navegadores :) - Gracias. – zulumojo

0

esto funcionará con seguridad. Tenga cuidado de manejar el evento KeyUp y no 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 trabajó en cambio por el mismo código.

No sé por qué, pero parece porque keyDown evento ocurre directamente después de pulsar cualquier tecla, incluso si eso era tecla CTRL, por lo que si ha presionado ctrl +Hasta va a presionar ctrl clave antes de la tecla UP y por lo tanto el evento se producirá antes de que pueda presionar la otra, también se pulsa la segunda tecla se activa el evento de nuevo.

Durante el uso de KeyUp no se disparará el evento hasta que suelte la tecla, por lo que puede presionar Ctrl , y la prensa la segunda llave, lo que dará lugar a un evento.

-1

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

i utilizar este código porque yo no sé por qué cuando uso:

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

no funcionó.

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

Este código sólo funcionará si pulsa primero LeftCtrl y "ARRIBA". Si orden no tiene importancia, recomiendo que uno:

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

En ese caso, tanto Ctrl son tomadas en cuenta, y no tiene importancia sobre el orden.

Cuestiones relacionadas