我正在编写一个win32应用程序,该应用程序需要在不在焦点上时采用热键(它在后台运行而无需绘制窗口)。我使用注册热键来组合几个键,但这会阻止所有其他进程。例如,我分配了"c"键,当我在记事本中按下它时,没有任何反应。
RegisterHotKey()
注册全局热键。热键在常规键盘输入处理之前处理,这意味着如果您成功注册热键,按该键将导致您获得热键消息,而不是具有焦点的应用程序获得正常的WM_KEYDOWN
/WM_CHAR
消息。您有效地阻止了其他应用程序看到该键。
这是设计使然。
显然,避免像您描述的那样发生冲突的解决方案是不要注册其他应用程序可能使用的热键。如果将没有任何限定符的 C 注册为热键,则其他程序不会看到按下的 C 键。相反,您应该使用Ctrl/Shift/Alt等限定符来防止热键干扰键盘的正常使用。
除非其他程序处于活动状态,否则无法注册全局热键。如果你想实现这样的情况,比如说,你的热键在桌面处于活动状态时工作,但没有其他任何东西,你可以使用消息钩子将代码注入桌面的进程(通过SetWindowsHookEx()
)并以这种方式拦截按键。但是你不能用RegisterHotKey()
来做.
我只是尝试了UnregisterHotKey()
,用keybd_event()
模拟了密钥,然后再次RegisterHotKey()
。我不建议将其作为生产代码,最好使用钩子,但作为一个快速的黑客,我只想说它有效。
GetAsyncKeyState()
可用于确定是否按下了某些键,即使程序在后台运行也是如此。