C++ 如何防止RegisterHotKey阻止其他应用程序的密钥?

C++ 如何防止RegisterHotKey阻止其他应用程序的密钥?,c++,winapi,registerhotkey,C++,Winapi,Registerhotkey,我正在编写一个win32应用程序,它需要在不聚焦的情况下获取热键(它在后台运行而不绘制窗口)。我使用RegisterHotKey来分配一些键,但这会阻止其他进程的调用。例如,我分配了“c”键,当我在记事本中按下它时,什么都没有发生 GetAsyncKeyState() 可用于确定是否按下某些键,即使程序在后台运行 RegisterHotKey()注册全局热键。热键是在常规键盘输入处理之前处理的,这意味着如果您成功注册热键,按下该键将获得热键消息,而不是焦点应用程序获得正常的WM\u KEYDO

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

GetAsyncKeyState()
可用于确定是否按下某些键,即使程序在后台运行

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

这是故意的

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


除非其他程序处于活动状态,否则无法注册全局热键。如果您想实现这样一种情况,比如说,当桌面处于活动状态时,热键可以工作,但没有其他功能,那么您可以使用消息挂钩(通过
SetWindowsHookEx()
)将代码注入桌面进程,并以这种方式截获按键。但是你不能用注册表hotkey()

你要求更改按“C”应该解释为什么,现在你说你不是故意的?如果你想让记事本使用“C”键,不要将其注册为热键。我也不清楚你的应用程序应该如何工作。当你的应用程序应该使用击键时,实际情况是什么?轮询从来都不是一个好主意。你必须不断地调用API,然后你仍然不能保证得到所有的按键。如果“前台线程属于另一个进程,桌面不允许挂钩或日志记录”,API调用也将失败。如文件所述。如果您有更好的建议,请告诉我。我不会有人认为答案没有帮助,尤其是当他们是问题的唯一答案时。但是谢谢你input@IInspectable如此积极和支持,就像往常一样。投赞成票的答案——对我来说效果很好。