在 c++ 中没有修饰符的 RegisterHotKey

RegisterHotKey without a modifier in c++

本文关键字:RegisterHotKey c++      更新时间:2023-10-16

这段代码在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真的是多余的。