我正在编写一个 win32 应用程序,它需要在不聚焦时使用热键(它在后台运行而不绘制窗口)。我使用 RegisterHotKey 来分配几个键,但这会阻止其他所有进程。例如,我分配了“c”键,当我在记事本中按下它时,什么也没有发生。
问问题
2882 次
3 回答
4
RegisterHotKey()
注册全局热键。热键在常规键盘输入处理之前处理,这意味着如果您成功注册热键,按下该键将导致您获得热键消息,而不是焦点应用程序获得正常WM_KEYDOWN
/WM_CHAR
消息。您已有效阻止其他应用程序看到该按键。
这是设计使然。
显然,避免您描述的冲突的解决方案是不注册其他应用程序可能使用的热键。如果您将没有任何限定符的 C 注册为热键,那么其他程序将不会看到 C 键被按下。相反,您应该使用 Ctrl/Shift/Alt 等限定符来防止热键干扰键盘的正常使用。
除非其他程序处于活动状态,否则无法注册全局热键。如果您想实现这样的情况,例如,您的热键在桌面处于活动状态时有效,但没有其他功能,您可以使用消息挂钩将代码注入桌面进程(通过SetWindowsHookEx()
)并以这种方式拦截按键。但是你不能用RegisterHotKey()
.
于 2013-09-08T21:41:38.967 回答
2
我刚试过UnregisterHotKey()
,用 模拟钥匙keybd_event()
,然后RegisterHotKey()
再试一次。我不推荐它作为生产代码,使用钩子可能会更好,但作为一个快速破解我只想说它有效。
于 2021-07-01T19:12:52.887 回答
1
GetAsyncKeyState()
可用于确定是否按下了某些键,即使程序在后台运行时也是如此。
于 2013-09-08T18:01:10.140 回答