2012-08-01 70 views
16

我有一个简单的WPF应用程序,我需要捕获在Windows(操作系统)中按F1键,即使我的WPF窗口最小化,或者它未被激活。全球Windows键按

我检测到这个问题。我在互联网上搜索,我发现很多结果,但他们没有帮助我。

为了检测应用程序内部按下一个键我用这个简单的代码:

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

但如果没有激活我的窗前,这是行不通的。

那么,我的问题是:如何检测全局按键?

我再说一遍:这是一个WPF应用程序。

回答

21

不需要Keyboard Hooking。只需使用RegisterHotKey(定义系统范围的热键)和UnregisterHotKey从Windows API。尝试在C#中使用这些从pinvoke.net或这些教程:

有在Microsoft Forums样本。

您可以使用这些改性剂和Virtual-Key Codes

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

例如F1键是VK_F1 (0x70)

+1

多么惊喜。有一次,我来到一个全局热键线程,最重要的答案是“RegisterHotKey”而不是“SetWindowsHookEx”。 – CodesInChaos 2012-08-01 09:30:09

0

当您的应用程序不专注 - messags pump将无法获取任何内容 - 您需要使用系统级API来挂接密钥。 (尝试在SetWindowsHookEx上搜索信息)