带有 RIDEV_NOHOTKEYS 的原始输入键盘会导致奇怪的行为

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

当我注册原始输入键盘设备并设置 RIDEV_NOHOTKEYS 标志时,如下所示:

RAWINPUTDEVICE device = {};
device.usUsagePage = 0x01;
device.usUsage = 0x06;
device.dwFlags = RIDEV_NOHOTKEYS;
device.hwndTarget = hwnd;

当我的窗口获得焦点时,左右窗口键停止工作(它们不会调出开始菜单)。我能想到的所有其他热键仍然有效。 Alt-tab 可以工作,但它不会调出带有缩略图的“花哨”alt-tab 菜单,而是带有图标的旧经典菜单:

classic alt-tab menu

WM_INPUT消息处理没有任何异常情况发生;我查看结构,并在最后调用 DefWindowProc。我也没有安装任何键盘挂钩,或任何其他形式的输入。

根据文档,RIDEV_NOHOTKEYS 应该只影响应用程序定义的热键。即使我自己没有注册任何热键,也会发生这种情况,因此没有应用程序定义的热键,除非 Windows 本身注册了一些热键(但是,为什么它们不是系统热键?)。

有人对此有一些经验或解释为什么会发生这种情况,以及如何防止这种情况的建议吗? (这是在 Windows 10 版本 1803 上)

windows winapi raw-input
1个回答
0
投票

根据文档,

RIDEV_NOHOTKEYS
应该只影响应用程序定义的热键。

因为事实并非如此。引用 Casey Muratori 的优秀文章“寻找并修复五秒失速”(镜子:12;重点是我的):

第二天早上我醒来时,出于某种原因,我想起了Windows 编程人员必须记住的最重要的事情:永远、永远不要相信文档。它总是不准确或不完整。因此,当我坐在键盘前时,我做的第一件事就是在初始化原始输入时尝试使用

RIDEV_NOHOTKEYS
标志。

你看,前一天我没有费心去尝试这个标志,因为它在文档中明确表示它不会阻止系统级热键,只会阻止应用程序级热键(就像您自己使用

RegisterHotKey
创建的那种) )。但我为什么相信这一点?这只是有人在需要创建文档页面时写下的内容。他们可能从一开始就从未见过原始输入的实际代码。

惊喜,

RIDEV_NOHOTKEYS
有效。经过一番大惊小怪之后,要使The Witness不受Windows徽标键的影响,所要做的就是在原始输入初始化期间设置一个小标志。无需键盘挂钩。

此外,Hacker News(12)上对这篇文章的讨论揭示了 同一作者在 2014 年发布的一条关于 Windows 8 中相同问题的推文:

@cmuratori 显然,如果不完全删除 ALT-TAB 支持,您就无法再在 Windows 8 中指定 RIDEV_NOHOTKEYS

 :(

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