我正在为基于Raw Input的Windows编写键盘输入系统。它是通过设置RIDEV_NOLEGACY标志实现的,并且只有当客户端未处理输入时,才会手动生成旧键盘消息。
我设法使其正常工作,但是语言切换热键(在我的情况下为Alt + Shift)现在已损坏。
系统必须:
区别不同的输入设备;
检测设备[dis]连接;
允许处理程序使用输入,以防止其被最低优先级处理程序处理;
保持alt codes功能;
如果可能,请使accelerators的系统键也保持功能;
我尝试了许多原始输入设置的组合,但是每个组合都违反了一些要求。现在的主要问题是3。
使用RIDEV_NOLEGACY处理程序可以使用WM_INPUT或不对其进行处理。在第二种情况下,系统本身会生成WM_ [SYS] KEYUP / WM_ [SYS] KEYDOWN消息,并通过PostMessage将其发布。由于PostMessage不会更新线程的键盘状态,因此系统也会在适当的位置更新它。所以3、4和5可以。但是Alt + Shift停止响应。
没有RIDEV_NOLEGACY时,Alt + Shift会按预期更改区域设置,但是无论某些客户端是否处理WM_INPUT,原始输入都会生成旧版WM_ [SYS] KEYUP / WM_ [SYS] KEYDOWN。
有一个最小的问题示例: https://github.com/niello/misc/tree/master/RawInputLocale
在Win10和Win8.1上复制,但自Vista以来在任何Windows上可能都是相同的。
请注意,如果在示例中将USE_NOLEGACY_RAW_INPUT设置为 true ,则仅针对第二个击键生成WM_CHAR消息,就好像我们的系统客户端消耗了另一个击键一样,但是如果您尝试更改输入语言环境,什么也没发生。而且,如果将USE_NOLEGACY_RAW_INPUT设置为 false ,您将正常切换语言环境并收到WM_INPUTLANGCHANGE,但是也会为消耗的按键生成WM_CHAR。
我的想法已经用完了,因此任何帮助将不胜感激。
答案 0 :(得分:0)
第二天似乎没有简单的解决方案。 RIDEV_NOLEGACY只是通过热键取消了语言切换。好消息是,所有必要的逻辑都可以手动实现。那是我目前的解决方案。它考虑了系统热键设置,在用作热键时抑制了“`”键的字符生成,甚至无需重新启动应用程序就可以检测系统热键更改。 该代码在同一repo中可用。 希望这也会对其他人有所帮助。