带有RIDEV_NOHOTKEYS的Raw Input键盘显示经典的Alt + Tab菜单

时间:2019-03-13 16:25:40

标签: winapi raw-input

我正在尝试为使用RawInput处理键盘事件的窗口禁用Windows键。这样做的通常方法是安装一个低级键盘钩子,并在那里过滤掉Windows键事件。为了使其与RawInput一起使用,我必须使用RIDEV_NOHOTKEYS初始化键盘设备。但是,当我这样做时,如果我随后从应用程序中按Alt + Tab键,则由于某种原因Windows 10会显示经典的Alt + Tab键:

alt-tab menu

我没有过滤掉低级键盘挂钩中的Alt或Tab事件,如果我根本不安装低级键盘挂钩,也会发生这种情况,只需使用RIDEV_NOHOTKEYS初始化键盘设备即可。我尝试为WM_INPUT消息返回0,并尝试调用默认的窗口proc,似乎无济于事...以前有人遇到过此问题吗?

1 个答案:

答案 0 :(得分:1)

添加低级挂钩(WH_KEYBOARD_LL)可以防止Alt键消息传递到其他窗口。请参阅“ LowLevelKeyboardProc callback function”。

WH_KEYBOARD_LL挂钩只能用global scope设置。

// Register hook
hinstDLL = LoadLibrary(TEXT("sysmsg.dll"));
hkprcSysMsg = (SYSMESSAGEPROC)GetProcAddress(hinstDLL, "SysMessageProc");

HHOOK hook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)hkprcSysMsg, hinstDLL, 0);

挂钩DLL中的回调函数:

__declspec(dllexport)
LRESULT __cdecl SysMessageProc(int nCode, WPARAM wParam, LPARAM lParam)
{

    if (nCode < 0)  // do not process message 
        return CallNextHookEx(NULL, nCode,
            wParam, lParam);

    if (wParam == WM_SYSKEYDOWN)
    {
        if(((tagKBDLLHOOKSTRUCT*)lParam)->vkCode == VK_LMENU || ((tagKBDLLHOOKSTRUCT*)lParam)->vkCode == VK_RMENU)
        return 1;
    }


    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

更多参考:“ Using Hooks”“ Keyboard Input”“ WM_SYSKEYDOWN message”“ KBDLLHOOKSTRUCT structure”“ Virtual-Key Codes

  

注意

     

挂钩往往会减慢系统速度,因为它们会增加   系统必须对每个消息执行处理。你应该   仅在必要时安装挂钩,并尽快将其卸下。

     

您应仅将全局挂钩用于调试目的;除此以外,   你应该避免它们。全局挂钩会损害系统性能并导致   与实现相同类型的其他应用程序冲突   全局钩子。