【问题标题】:Catching "global hotkeys" (Windows)捕捉“全局热键”(Windows)
【发布时间】:2011-07-12 16:09:10
【问题描述】:

现在我一直在尝试创建与一键通语音聊天应用程序类似的功能,但到目前为止我找不到任何合适的解决方案。我没有使用 MFC 或 CLR。​​

问题很简单。我的窗口通常应该没有焦点(即最小化等),但我需要对按键做出反应(基本上,我什至不想知道按钮是否被按住)。不幸的是,WM_KEYDOWN 仅在窗口具有键盘焦点时才有效。我确实知道,例如 Teamspeak 为此使用 DirectInput,但我也知道没有它也绝对可以完成,我非常喜欢。

我可以使用的唯一其他解决方案是使用 GetAsyncKeyState 进行轮询,但看起来这也不是一个好的解决方案。如果可能的话,我还是更喜欢使用 Windows 消息。

【问题讨论】:

    标签: windows keyboard focus hotkeys directinput


    【解决方案1】:

    问题可以通过RegisterHotKeyglobal low-level keyboard hook 解决。

    RegisterHotKey(Cody Gray 在推荐中建议的)可能是这里更合适的选择。

    【讨论】:

    • 低级键盘钩子是一种可能的选择,但对于捕获一些全局热键来说肯定是过度的。更好的解决方案是RegisterHotKey function
    • 好吧,我觉得有点笨,没猜到RegisterHotKey函数的名字; API 对我来说太直观了。谢谢你们俩。
    • @dialer:没有理由感到难过。几天前我回答了一个问题,建议当RegisterHotKey 可以正常工作时使用全局挂钩。谢天谢地,其他人纠正了我(使这个网站很棒的部分原因)。并不是说 Windows API 不直观(至少,对我来说不是),只是它太大了,如果你不一直使用它们,你就会忘记它们!很高兴我们能提供帮助。
    • @Cody:谢谢你提醒我RegisterHotKey。这正是我在这里发生的事情:忘记了,最近碰巧使用了键盘挂钩......
    • 如果另一个应用程序使用我将要使用的相同热键,那么 RegisterHotKey 将失败。不会吗?在这种情况下,替代方法是使用全局键盘挂钩。不是吗?
    【解决方案2】:

    我同意乔恩的观点。使用 user32.dll 和 RegisterHotKey 函数。非常有用的示例代码位于:https://www.codeproject.com/kb/cs/kiosk_cs.aspx?display=print

    如果像我最初那样,代码看起来完全是乱码,而您不知道该怎么做,请观看教程:https://www.youtube.com/watch?v=qQWqGOaZiFI 它们非常很有用!

    如果您尝试注册系统热键:但请注意,第一个链接中的代码会返回错误,具体取决于您尝试注册的系统热键。我的问题突出了这个问题:How do you disable system hotkeys in user32.dll?(目前未解决)。如果您尝试覆盖系统热键,那里还有一个代码编辑可以修复您将遇到的错误之一:

    [DllImport("user32.dll", SetLastError = true)]
    

    我确实设法阻止了 Windows + E 热键,但 Alt + F4Home + Right 等其他热键并没有被禁用,并且会返回一个错误。

    如果您不尝试覆盖系统热键,这不应该成为您的问题。但是,如果您的某个热键无法注册,我建议您使用下面的代码来诊断您的代码。

    Marshal.GetLastWin32Error()
    

    ^ 该行代码的完整上下文在第一个链接中!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 1970-01-01
      • 2018-07-12
      • 2011-02-16
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      相关资源
      最近更新 更多