这段代码在 Windows 下为 SHIFT+F5 和 SHIFT+F6 注册了 2 个全局热键,它在所有情况下都可以正常工作,包括完全其他应用程序具有焦点的情况,例如游戏。
enum{ KEY_F5 = 1, KEY_F6 = 2 };
RegisterHotKey(0, KEY_F5, MOD_SHIFT, VK_F5);
RegisterHotKey(0, KEY_F6, MOD_SHIFT, VK_F6);
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
{
PeekMessage(&msg, NULL, 0, 0, 0);
switch (msg.message){
case WM_HOTKEY:
if (msg.wParam == KEY_F5){
// code
}
else if (msg.wParam == KEY_F6){
// code
}
}
}
但是如果我替换
RegisterHotKey(0, KEY_F5, MOD_SHIFT, VK_F5);
RegisterHotKey(0, KEY_F6, MOD_SHIFT, VK_F6);
通过
RegisterHotKey(0, KEY_F5, 0, VK_F5);
RegisterHotKey(0, KEY_F6, 0, VK_F6);
因为我的目标是两个都将 F5 和 F6 作为热键,而不必一直按 SHIFT,所以它只有在我的程序获得焦点时才有效,而其他程序没有。我怎样才能实现只有F?就像 TS3 那样的全局热键。即使应用程序没有焦点,它也必须工作。
最佳答案
尝试使用 MOD_NOREPEAT
而不是 MOD_SHIFT
。我也没有看到使用“PeakMessage”的任何必要性。由于您已经调用了 GetMessage()
,因此 PeakMessage 确实是多余的。
关于c++ - 在 C++ 中没有修饰符的 RegisterHotKey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26929928/