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

标签 c++ windows winapi

这段代码在 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/

相关文章:

c++ - 如何扫描无线网络并显示所有连接的计算机和设备的列表

c++ - 如何使用 "Stop Button"停止进程

windows - 找不到要通过 git bash 删除的文件,但它显示在文件资源管理器中

python - 将多个参数传递给函数的最有效方法?

windows - 如何在Delphi中模拟下拉表单?

vb.net - 断开 iTunes COM

不能包含这两个文件(WinSock2、Windows.h)

winapi - Windows 8 ARM是否也称为 "Windows RT"是否有第三方开发人员可以使用Winapi(win32)?

c++ - 这是 gcc 优化错误吗?

c++ - 使用 [[deprecated]] 时会发出 3 次警告