我正在尝试为使用RawInput处理键盘事件的窗口禁用Windows键。这样做的通常方法是安装一个低级键盘钩子,并在那里过滤掉Windows键事件。为了使其与RawInput一起使用,我必须使用RIDEV_NOHOTKEYS初始化键盘设备。但是,当我这样做时,如果我随后从应用程序中按Alt + Tab键,则由于某种原因Windows 10会显示经典的Alt + Tab键:
我没有过滤掉低级键盘挂钩中的Alt或Tab事件,如果我根本不安装低级键盘挂钩,也会发生这种情况,只需使用RIDEV_NOHOTKEYS初始化键盘设备即可。我尝试为WM_INPUT消息返回0,并尝试调用默认的窗口proc,似乎无济于事...以前有人遇到过此问题吗?
答案 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”
注意
挂钩往往会减慢系统速度,因为它们会增加 系统必须对每个消息执行处理。你应该 仅在必要时安装挂钩,并尽快将其卸下。
您应仅将全局挂钩用于调试目的;除此以外, 你应该避免它们。全局挂钩会损害系统性能并导致 与实现相同类型的其他应用程序冲突 全局钩子。