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 应用程序。

4

2 回答 2

24

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

Microsoft 论坛中有一个示例。

您可以使用这些修饰符和虚拟键代码

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

例如 F1 键是VK_F1 (0x70).

于 2012-08-01T04:49:06.980 回答
0

当您的应用程序不在焦点上时 - 消息泵不会得到任何东西 - 您需要使用系统级 API 来挂钩密钥。(尝试在 SetWindowsHookEx 上搜索信息)

于 2012-08-01T03:57:06.140 回答