捕获“全球热键”(Windows)

时间:2011-03-10 12:00:39

标签: windows keyboard focus hotkeys directinput

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

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

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

2 个答案:

答案 0 :(得分:2)

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

RegisterHotKey(Cody Gray在评价中建议的)可能是更合适的选择。

答案 1 :(得分:0)

我同意乔恩。使用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 + F4 Home + Right 没有被禁用,会返回错误。

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

Marshal.GetLastWin32Error()

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