Win32:在WH_KEYBOARD_LL ||中获取设备信息使用原始输入时阻止WM_INPUT上的输入

时间:2010-08-24 14:37:48

标签: c# windows

我需要编写一个程序来修改Windows下某个 usb hid键盘(条形码扫描器)的输入。应适用以下工作流程:

收听来自设备的输入 - >记录输入 - >停止进入活动应用程序的输入 - >处理记录的输入和输出结果到活动应用程序

所以我确实搜索了这个,但现在我被卡住了!

“记录输入”显然有两个选项:低级别挂钩WH_KEYBOARD_LL并对原始输入中的WM_INPUT事件作出反应

问题是: - 使用WH_KEYBOARD_LL我发现无法确定输入来自哪个设备 - 在WM_INPUT事件中,我发现无法停止击键 - 如果WH_KEYBOARD_LL用于停止击键,它将无法进入原始输入,因此不会触发WM_INPUT,因此我无法确定击键的来源

我在用户模式中有哪些选择?

此致 多米尼克

4 个答案:

答案 0 :(得分:1)

@Hans Passant:WH_KEYBOARD_LL是一个全局唯一的钩子,可以在C#中设置

答案 1 :(得分:1)

可悲的是,没有简单的方法可以做到这一点。您使用的是WH_KEYBOARD_LLWM_INPUT。可能有一个选择的可能性:

您是否测试过钩子之前是否发生WM_INPUT?如果是这种情况,您可以记住WM_INPUT中的字符和 - 在钩子中 - 仅删除来自条形码扫描仪的字符。

答案 2 :(得分:1)

@Michael:似乎WM_INPUT发生在钩子之后,这就是问题......

PS:很抱歉没有使用评论...我刚发布这个问题后决定创建一个帐户,所以我甚至不能评论我的OP或任何答案,除了我自己的答案:/

答案 3 :(得分:-1)

我相信RAWINPUT是你最好的选择,这就是微软所说的。

原始输入模型与键盘和鼠标的原始Windows输入模型不同。在原始输入模型中,应用程序以发送或发布到其窗口的消息的形式接收与设备无关的输入,例如WM_CHAR,WM_MOUSEMOVE和WM_APPCOMMAND。相反,对于原始输入,应用程序必须注册它想要从中获取数据的设备。此外,应用程序通过WM_INPUT消息获取原始输入。

原始输入模型有几个优点:

  • 应用程序不必检测或打开输入设备。
  • 应用程序直接从设备和进程获取数据 满足其需求的数据。
  • 应用程序可以区分输入源,即使它是 来自相同类型的设备。例如,两个鼠标设备。
  • 应用程序通过指定数据来管理数据流量 设备集合或仅特定设备类型。

HID设备可以在市场上使用时使用,无需等待新的消息类型或更新的操作系统在WM_APPCOMMAND中拥有新命令。

你可以研究它here

我还有一个例子here