2009-04-02 24 views

Respuesta

13

creo que usted será mejor cuando se utiliza la función API GetKeyboardState.

[DllImport ("user32.dll")] 
public static extern int GetKeyboardState(byte[] keystate); 


private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    byte[] keys = new byte[256]; 

    GetKeyboardState (keys); 

    if ((keys[(int)Keys.Up] & keys[(int)Keys.Right] & 128) == 128) 
    { 
     Console.WriteLine ("Up Arrow key and Right Arrow key down."); 
    } 
} 

En el evento KeyDown, simplemente solicita el 'estado' del teclado. GetKeyboardState rellenará la matriz de bytes que proporcione, y cada elemento de esta matriz representa el estado de una clave.

Puede acceder a cada estado clave utilizando el valor numérico de cada código de tecla virtual. Cuando el byte para esa tecla se establece en 129 o 128, significa que la tecla está presionada (presionada). Si el valor para esa tecla es 1 o 0, la tecla está arriba (no presionada). El valor 1 está destinado al estado de tecla conmutada (por ejemplo, estado de bloqueo de mayúsculas).

Para obtener más información, consulte el Microsoft documentation for GetKeyboardState.

1

Hmm, ¿hay eventos separados para cada tecla hacia abajo?

Puede crear cuatro booleanos para cada flecha. Cuando se presiona, establece el booleano de esa flecha en verdadero. Si se lanza, establezca el booleano de esa flecha en falso.

Luego puede verificar si el booleano arriba y el booleano derecho son verdaderos y luego realice su acción.

14

un poco de código de prueba de concepto para que, en el supuesto Form1 contiene label1:

private List<Keys> pressedKeys = new List<Keys>(); 

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    pressedKeys.Add(e.KeyCode); 

    printPressedKeys(); 
} 

private void Form1_KeyUp(object sender, KeyEventArgs e) 
{ 
    pressedKeys.Remove(e.KeyCode); 

    printPressedKeys(); 
} 

private void printPressedKeys() 
{ 
    label1.Text = string.Empty; 
    foreach (var key in pressedKeys) 
    { 
     label1.Text += key.ToString() + Environment.NewLine; 
    } 
} 
+0

Con @JamesBarrass enfoque que puede tener Ctrl + X + Carta de la letra Y: http://stackoverflow.com/questions/11157868/capturing-ctrl-multiple-key-downs –

0

Use SPY ++ para ver cómo se activan las teclas de acceso directo. Básicamente si se mantienen presionadas varias teclas de flecha al mismo tiempo, la primera tecla que se golpeó disparará los eventos y cuando se toque la segunda tecla comenzará a disparar y ya no se verán los eventos de la primera. Cuando se publiquen, verán sus eventos clave. Sugeriría que implementes las banderas bool sugeridas anteriormente es rápido y simple.

4

Con

Keyboard.IsKeyDown(Key.YourKey) 

que puede manejar múltiples keydowns.

+1

Hola, ¿podrían detallar de qué biblioteca proviene el Keyboard? – randfur

+2

System.Windows.Input.KeyBoard – Andreas

+0

Bien ajustado para WPF. (Hablando en ensamblador, viene de PresentationCore.dll) –

0

Hay una biblioteca administrada MouseKeyHook as nuget que le proporciona un contenedor gestionado de conveniencia. Source code on github.

Recientemente se ha agregado compatibilidad para detectar atajos, combinaciones de teclas y secuencias. Aquí es un ejemplo de uso para tratar con flechas:

Hook.AppEvents().OnCombination(new Dictionary<Combination, Action> 
{ 
    {Combination.FromString("Left"), GoWest}, 
    {Combination.FromString("Left+Up"), GoNorthWest}, 
    {Combination.FromString("Up+Left"), GoNorthWest}, 
    {Combination.FromString("Up"), GoNorth}, 
    {Combination.FromString("Up+Right"), GoNorthEast}, 
    {Combination.FromString("Right+Up"), GoNorthEast}, 
}); 

Para obtener más información, véase: Detecting Key Combinations and Seuqnces

Cuestiones relacionadas