带RIDEV_NOHOTKEYS的原始输入键盘显示经典的Alt + Tab菜单

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

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

alt-tab menu

我没有在低级键盘钩子中过滤掉Alt或Tab事件,如果我根本不安装低级键盘钩子,只需用RIDEV_NOHOTKEYS初始化键盘设备就会发生这种情况。我尝试为WM_INPUT消息返回0,我尝试调用默认窗口proc,似乎没有任何帮助......有没有人之前有这个问题?

winapi raw-input
1个回答
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

注意

挂钩往往会降低系统速度,因为它们会增加系统必须为每条消息执行的处理量。您应该仅在必要时安装挂钩,并尽快将其删除。

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

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