2012-08-01 17 views
16

Ho una semplice applicazione WPF e devo catturare il tasto F1 premuto in Windows (Operation System), anche se la finestra WPF è ridotta a icona, o non è attivata.Global Windows Key Press

Ho problemi nel rilevare questo. Ho cercato su Internet e ho trovato molti risultati, ma non mi hanno aiutato.

Per la rilevazione pressato all'interno di applicazioni una chiave ho usato questo semplice codice:

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

Ma questo non funziona quando la mia finestra non è attivata.

Quindi, la mia domanda è: come rilevare la pressione di un tasto globale?

Ripeto: È un'applicazione WPF.

risposta

21

Non c'è bisogno di Keyboard Hooking. Basta usare RegisterHotKey (Definisce un tasto di scelta rapida per l'intero sistema) e UnregisterHotKey dall'API di Windows. Prova a utilizzare questi in C# da pinvoke.net o questi tutorial:

C'è un campione in Microsoft Forums.

È possibile utilizzare questi modificatori e Virtual-Key Codes:

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

ad esempio tasto F1 è VK_F1 (0x70).

+1

Che piacevole sorpresa. Per una volta vengo a un thread hotkey globale e la risposta più alta è "RegisterHotKey" e non "SetWindowsHookEx". – CodesInChaos

0

Quando l'applicazione non è a fuoco - messagg pump non ottiene nulla - è necessario utilizzare le API a livello di sistema per le chiavi di aggancio. (prova a cercare informazioni su SetWindowsHookEx)