2012-08-22 38 views
5

¿Cómo puedo detectar si alguna tecla del teclado se está presionando actualmente? No estoy interesado en cuál es la clave, solo quiero saber si todavía hay alguna tecla presionada.Cómo detectar si se presiona alguna tecla

if (Keyboard.IsKeyDown(Key.ANYKEY??) 
{ 

} 

Respuesta

7
public static IEnumerable<Key> KeysDown() 
{ 
    foreach (Key key in Enum.GetValues(typeof(Key))) 
    { 
     if (Keyboard.IsKeyDown(key)) 
      yield return key; 
    } 
} 

usted podría entonces hacer:

if(KeysDown().Any()) //... 
2

Iterar el System.Windows.Input.Key enum values.

public static bool IsAnyKeyDown() 
    { 
     var values = Enum.GetValues(typeof(Key)); 

     foreach (var v in values) 
     { 
      if (((Key)v) != Key.None) 
      { 
       if (Keyboard.IsKeyDown((Key)v)) 
       { 
        return true; 
       } 
      } 
     } 

     return false; 
    } 
1

buena respuesta aquí ... obtener el conjunto de todos los keystates a la vez utilizando GetKeyboardState():

Lo anterior está comprobando el estado en directo del teclado.

Si confía en conectar sucesos hasta los eventos KeyDown/KeyUp para rastrear el estado del teclado ... entonces esto puede no ser tan preciso.

Eso es porque confía en el mensaje de bombeo para procesar y enviar esos mensajes KeyDown/KeyUp .... pueden entregarse después de que el estado real del teclado haya cambiado nuevamente.

También porque cuando se ejecuta su bit de código que está interesado en el estado del teclado (generalmente en el hilo de la interfaz de usuario) ... KeyDown o KeyUp no pueden interrumpirlo ... a medida que se envían en el hilo de la interfaz de usuario también ... es por eso que se debe usar GetKeyBoardState() o Keyboard.IsKeyDown.

(lo anterior es suponiendo que usted quiere y se preocupa por el estado en vivo)

+0

buena respuesta de hecho –

4

Si desea detectar tecla pulsada sólo en nuestra aplicación (cuando su ventana de WPF se activa) añadir KeyDown, como a continuación:

public MainWindow() 
{ 
    InitializeComponent(); 
    this.KeyDown += new KeyEventHandler(MainWindow_KeyDown); 
} 

void MainWindow_KeyDown(object sender, KeyEventArgs e) 
{ 
    MessageBox.Show("You pressed a keyboard key."); 
} 

Si quiere cancelar saber que cuando se presiona una tecla, incluso si la ventana de WPF no está activa, es un poco más difícil pero posibile. Recomiendo RegisterHotKey (define una tecla de acceso rápido para todo el sistema) y UnregisterHotKey de la API de Windows. Intente utilizar estos en C# desde pinvoke.net o estos tutoriales:

Thse es una muestra de Microsoft Forums.

Utilizará Virtual-Key Codes. Espero que haya sido claro y usted comprenderá mi respuesta.

Cuestiones relacionadas