2012-08-01 13 views
16

Mam prostą aplikację WPF i muszę przechwycić klawisz F1 wciśnięty w systemie Windows (Operation System), nawet jeśli moje okno WPF jest zminimalizowane lub nie jest aktywowane.Globalny klucz Windows Naciśnij

Mam problemy z wykryciem tego. Szukałem w Internecie i znalazłem wiele wyników, ale mi nie pomogły.

do wykrywania klawisz wciśnięty wewnątrz aplikacji użyłem ten prosty kod:

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

Ale to nie działa, gdy mój okno nie jest aktywne.

Moje pytanie brzmi: jak wykrywać naciśnięcie klawisza globalnego?

Powtarzam: Jest to aplikacja WPF.

Odpowiedz

21

Nie ma potrzeby, aby Keyboard Hooking. Po prostu użyj RegisterHotKey (Definiuje systemowy klawisz skrótu) i UnregisterHotKey z Windows API. Spróbuj użyć je w C# od pinvoke.net lub tych tutoriali:

Jest próbki w Microsoft Forums.

Można użyć tych modyfikatorów i Virtual-Key Codes:

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

na przykład klawisz F1 jest VK_F1 (0x70).

+1

Co za miła niespodzianka. Po raz pierwszy przychodzę do globalnego wątku Hotkey, a górną odpowiedzią jest 'RegisterHotKey', a nie' SetWindowsHookEx'. – CodesInChaos

0

Gdy twoja aplikacja nie jest aktywna - pompa komunikatów nic nie dostanie - do zaszyfrowania kluczy musisz użyć interfejsów API na poziomie systemu. (spróbuj wyszukać informacje w SetWindowsHookEx)