2

我正在编写一个 win32 应用程序,它需要在不聚焦时使用热键(它在后台运行而不绘制窗口)。我使用 RegisterHotKey 来分配几个键,但这会阻止其他所有进程。例如,我分配了“c”键,当我在记事本中按下它时,什么也没有发生。

4

3 回答 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 回答