在c++中不带修饰符的RegisterHotKey

问题描述 投票:0回答:2

这段代码在 Windows 下注册了 2 个全局热键:SHIFT+F5 和 SHIFT+F6,它在所有情况下都可以正常工作,包括完全其他应用程序具有焦点的情况,例如游戏。

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。即使应用程序没有焦点,它也必须工作。

c++ windows winapi
2个回答
0
投票

您需要设置全局键盘挂钩才能使其工作。有大量关于如何设置挂钩的信息。您可以从这里开始:

SetWindowsHookEx()


-1
投票

尝试使用

MOD_NOREPEAT
而不是
MOD_SHIFT
。我也不认为有必要使用“PeakMessage”。既然你已经调用了
GetMessage()
,PeakMessage 就真的是多余了。

© www.soinside.com 2019 - 2024. All rights reserved.