全局 Windows 键按下

18

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

我有问题无法检测到。我在互联网上搜索了许多结果,但它们没有帮助我。

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

AddHandler(Keyboard.KeyDownEvent, (KeyEventHandler)KeyPressed);
private void KeyPressed(object sender, KeyEventArgs e)
{
      if (e.Key == Key.F1)
      {
           //my code went here
      }
}
但是当我的窗口没有被激活时,这并不起作用。
所以,我的问题是:如何检测全局按键? 我再说一遍:这是一个WPF应用程序。
2个回答

23
无需使用键盘钩子技术,只需使用Windows API的RegisterHotKey(定义系统范围的热键)和UnregisterHotKey即可。 可尝试使用C#中的这些内容,来源于pinvoke.net或这些教程: Microsoft论坛中提供了样例代码。
可以使用以下修饰符和虚拟键码
MOD_ALT      (0x0001)
MOD_CONTROL  (0x0002)
MOD_NOREPEAT (0x4000)
MOD_SHIFT    (0x0004)
MOD_WIN      (0x0008)
例如,F1键的虚拟键码为VK_F1 (0x70)

1
真是惊喜的一件事。我第一次来到全局热键线程,发现最佳答案是RegisterHotKey而不是SetWindowsHookEx - CodesInChaos
我在Windows 10上使用MOD_WIN修饰键时遇到了错误。Windows可能不再允许您使用该修饰键进行挂钩。 - HgCoder

0

当您的应用程序不在焦点时 - 消息泵将无法获取任何内容 - 您需要使用系统级API来挂钩键。 (尝试搜索SetWindowsHookEx的信息)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接