2012-08-01 16 views
16

Tengo una aplicación WPF simple y necesito capturar la tecla F1 presionada en Windows (Sistema de operación), incluso si mi ventana WPF está minimizada, o no está activada.Global Windows Key Press

Tengo problemas para detectar esto. Busqué en Internet y encontré muchos resultados, pero no me ayudaron.

Para la detección de una tecla pulsada en el interior de la aplicación que utiliza este código simple:

AddHandler(Keyboard.KeyDownEvent, (KeyEventHandler)KeyPressed); 
private void KeyPressed(object sender, KeyEventArgs e) 
{ 
     if (e.Key == Key.F1) 
     { 
      //my code went here 
     } 
} 

Pero esto no funciona cuando mi ventana no se activa.

Entonces, mi pregunta es: cómo detectar la pulsación de tecla global?

Repito: Es una aplicación WPF.

Respuesta

21

No necesita Keyboard Hooking. Solo use RegisterHotKey (define una tecla de acceso rápido para todo el sistema) y UnregisterHotKey desde la API de Windows. Trate de usar estos en C# desde pinvoke.net o estos tutoriales:

No es una muestra de Microsoft Forums.

Puede utilizar estos modificadores y Virtual-Key Codes:

 
MOD_ALT  (0x0001) 
MOD_CONTROL (0x0002) 
MOD_NOREPEAT (0x4000) 
MOD_SHIFT (0x0004) 
MOD_WIN  (0x0008)

por ejemplo tecla F1 es VK_F1 (0x70).

+1

Qué agradable sorpresa. Por una vez, llegué a un hilo global de teclas rápidas y la respuesta más frecuente es 'RegisterHotKey' y no' SetWindowsHookEx'. – CodesInChaos

0

Cuando su aplicación no está enfocada, la bomba de mensajes no obtiene nada, necesita usar API de nivel de sistema para conectar claves. (Intente buscar información en SetWindowsHookEx)