【问题标题】:Global Windows Key Press全局 Windows 按键
【发布时间】:2012-08-01 03:39:16
【问题描述】:

我有一个简单的 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 应用程序。

【问题讨论】:

    标签: c# .net wpf keyboard-shortcuts


    【解决方案1】:

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

    Microsoft Forums中有一个样本。

    您可以使用这些修饰符和Virtual-Key Codes:

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

    例如 F1 键是VK_F1 (0x70)。

    【讨论】:

    • 真是个惊喜。这一次我来到一个全局热键线程,最佳答案是RegisterHotKey 而不是SetWindowsHookEx。
    • 我在 Windows 10 上使用 MOD_WIN 修饰键时出错。 Windows 可能不再允许您使用该修饰符。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 2014-07-06
      • 2011-02-16
      • 2011-06-30
      • 2020-05-02
      相关资源
      最近更新 更多