当我注册原始输入键盘设备并设置 RIDEV_NOHOTKEYS 标志时,如下所示:
RAWINPUTDEVICE device = {};
device.usUsagePage = 0x01;
device.usUsage = 0x06;
device.dwFlags = RIDEV_NOHOTKEYS;
device.hwndTarget = hwnd;
当我的窗口获得焦点时,左右窗口键停止工作(它们不会调出开始菜单)。我能想到的所有其他热键仍然有效。 Alt-tab 可以工作,但它不会调出带有缩略图的“花哨”alt-tab 菜单,而是带有图标的旧经典菜单:
WM_INPUT消息处理没有任何异常情况发生;我查看结构,并在最后调用 DefWindowProc。我也没有安装任何键盘挂钩,或任何其他形式的输入。
根据文档,RIDEV_NOHOTKEYS 应该只影响应用程序定义的热键。即使我自己没有注册任何热键,也会发生这种情况,因此没有应用程序定义的热键,除非 Windows 本身注册了一些热键(但是,为什么它们不是系统热键?)。
有人对此有一些经验或解释为什么会发生这种情况,以及如何防止这种情况的建议吗? (这是在 Windows 10 版本 1803 上)
根据文档,
应该只影响应用程序定义的热键。RIDEV_NOHOTKEYS
因为事实并非如此。引用 Casey Muratori 的优秀文章“寻找并修复五秒失速”(镜子:1,2;重点是我的):
第二天早上我醒来时,出于某种原因,我想起了Windows 编程人员必须记住的最重要的事情:永远、永远不要相信文档。它总是不准确或不完整。因此,当我坐在键盘前时,我做的第一件事就是在初始化原始输入时尝试使用
标志。RIDEV_NOHOTKEYS
你看,前一天我没有费心去尝试这个标志,因为它在文档中明确表示它不会阻止系统级热键,只会阻止应用程序级热键(就像您自己使用
创建的那种) )。但我为什么相信这一点?这只是有人在需要创建文档页面时写下的内容。他们可能从一开始就从未见过原始输入的实际代码。RegisterHotKey
惊喜,
有效。经过一番大惊小怪之后,要使The Witness不受Windows徽标键的影响,所要做的就是在原始输入初始化期间设置一个小标志。无需键盘挂钩。RIDEV_NOHOTKEYS
此外,Hacker News(1、2)上对这篇文章的讨论揭示了 同一作者在 2014 年发布的一条关于 Windows 8 中相同问题的推文:
@cmuratori 显然,如果不完全删除 ALT-TAB 支持,您就无法再在 Windows 8 中指定
RIDEV_NOHOTKEYS
:(