首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止RegisterHotKey拦截其他应用程序的密钥?

如何防止RegisterHotKey拦截其他应用程序的密钥?
EN

Stack Overflow用户
提问于 2013-09-09 00:02:43
回答 3查看 2.7K关注 0票数 2

我正在编写一个win32应用程序,它需要在非焦点时使用热键(它在后台运行,而不绘制窗口)。我使用RegisterHotKey来访问一些键,但这会阻塞所有其他进程。例如,我指定了“c”键,当我在记事本中按下它时,没有任何反应。

EN

回答 3

Stack Overflow用户

发布于 2013-09-09 05:41:39

RegisterHotKey()注册全局热键。热键是在常规键盘输入处理之前处理的,这意味着如果您成功注册了热键,按下该键将导致您获得热键消息,而不是具有焦点的应用程序获得正常的WM_KEYDOWN/WM_CHAR消息。你已经有效地阻止了其他应用程序看到那个按键。

这是设计好的。

显然,避免您所描述的冲突的解决方案是注册,而不是注册其他应用程序可能使用的热键。如果您在没有任何限定符的情况下将C注册为热键,那么其他程序将不会看到C键被按下。相反,您应该使用Ctrl/Shift/Alt等限定符,以防止热键干扰键盘的正常使用。

除非其他程序处于活动状态,否则无法注册全局热键。如果你想实现这样一种情况,比如说,你的热键在桌面处于活动状态时工作,而其他任何东西都不活动,你可以使用消息钩子将代码注入到桌面的进程中(通过SetWindowsHookEx()),并以这种方式截获按键。但是你不能用RegisterHotKey()做到这一点。

票数 4
EN

Stack Overflow用户

发布于 2021-07-02 03:12:53

我只是尝试了UnregisterHotKey(),用keybd_event()模拟了密钥,然后再次使用RegisterHotKey()。我不推荐它作为产品代码,使用钩子可能更好,但作为一个快速的技巧,我只想说它是有效的。

票数 2
EN

Stack Overflow用户

发布于 2013-09-09 02:01:10

代码语言:javascript
复制
GetAsyncKeyState()

可用于确定是否按下了某些键,即使程序在后台运行也是如此。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18685726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档