我正在编写一个win32应用程序,它需要在非焦点时使用热键(它在后台运行,而不绘制窗口)。我使用RegisterHotKey来访问一些键,但这会阻塞所有其他进程。例如,我指定了“c”键,当我在记事本中按下它时,没有任何反应。
发布于 2013-09-09 05:41:39
RegisterHotKey()注册全局热键。热键是在常规键盘输入处理之前处理的,这意味着如果您成功注册了热键,按下该键将导致您获得热键消息,而不是具有焦点的应用程序获得正常的WM_KEYDOWN/WM_CHAR消息。你已经有效地阻止了其他应用程序看到那个按键。
这是设计好的。
显然,避免您所描述的冲突的解决方案是注册,而不是注册其他应用程序可能使用的热键。如果您在没有任何限定符的情况下将C注册为热键,那么其他程序将不会看到C键被按下。相反,您应该使用Ctrl/Shift/Alt等限定符,以防止热键干扰键盘的正常使用。
除非其他程序处于活动状态,否则无法注册全局热键。如果你想实现这样一种情况,比如说,你的热键在桌面处于活动状态时工作,而其他任何东西都不活动,你可以使用消息钩子将代码注入到桌面的进程中(通过SetWindowsHookEx()),并以这种方式截获按键。但是你不能用RegisterHotKey()做到这一点。
发布于 2021-07-02 03:12:53
我只是尝试了UnregisterHotKey(),用keybd_event()模拟了密钥,然后再次使用RegisterHotKey()。我不推荐它作为产品代码,使用钩子可能更好,但作为一个快速的技巧,我只想说它是有效的。
发布于 2013-09-09 02:01:10
GetAsyncKeyState()可用于确定是否按下了某些键,即使程序在后台运行也是如此。
https://stackoverflow.com/questions/18685726
复制相似问题