是否可以吞下原始输入中的键?

时间:2013-02-23 15:35:02

标签: winapi keyboard raw-input

我正在使用 Raw Input API ,因为我需要能够以不同方式响应来自不同USB HID设备的密钥,即使它是相同的密钥。

我的窗口正确收到WM_INPUT条消息。我可以检索RAWKEYBOARD structure以获取我需要的所有信息。

现在我想阻止这些USB设备切换NumLock。我希望Raw Input API可以允许我吞下NumLock按键吗?

我已经尝试将WM_INPUT消息的结果设置为1,但这似乎没有效果。

(我在C#中写这个,但由于这是所有低级Windows API,你可能不需要知道C#或.NET来回答这个问题。)

编辑:哦,是的,我也尝试使用全局键盘钩子(SetWindowsHookEx)来吞下NumLock按键。不幸的是,只要我初始化Raw Input API,就会在窗口处于活动状态时不再调用全局键盘钩子。我也尝试在原始输入之后设置全局钩子,但效果相同。

3 个答案:

答案 0 :(得分:3)

Raw Input API不支持吞咽按键。

此外,它不会与同一进程中的SetWindowsHookEx 进行交互。一旦Raw Input API被初始化,钩子就会被取消挂钩。

解决方案是将它们放在单独的进程中。一个进程可以使用SetWindowsHookEx来吞下不需要的密钥,而另一个进程使用Raw Input API来处理通过的密钥。那你就跑两个。这对我来说很好。

答案 1 :(得分:0)

如上所述,没有直接的可能性,但您可以通过组合低级键盘钩子来实现。

在我的情况下,我需要从条形码扫描器中捕获代码,以便只有数字结束ENTER。

我的解决方案是RawInput仅从条形码扫描设备捕获所有密钥。键盘连接只捕获数字0-9和ENTER,并且根本不返回它。然后在代码中我决定是否需要返回密钥:

SendKeys.SendWait("{ENTER}");

答案 2 :(得分:-2)

你可以吞下"一些按键只能通过编写内核键盘过滤器驱动程序。所以,如果你还在,你需要一个DDK。