Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 如何在后台进程中读取条形码扫描仪输入?_Winapi_Barcode Scanner_Usb Hid - Fatal编程技术网

Winapi 如何在后台进程中读取条形码扫描仪输入?

Winapi 如何在后台进程中读取条形码扫描仪输入?,winapi,barcode-scanner,usb-hid,Winapi,Barcode Scanner,Usb Hid,我正在使用连接到Windows PC的条形码扫描仪。它被配置为USB HID设备,这是该扫描仪最可靠的工作模式。我已经开发了一些软件来注册它的输入。问题是,我想让一些程序在后台运行,从条形码扫描仪截取数据,并通过网络发送获得的数据。我已经检查了一些类似的解决方案,但似乎人们大多倾向于使用背景窗口 -这里有一个类似的问题,但答案描述了Java GUI表单的swing KeyListener子级 -也指出了类似的想法 这是一个内部使用的应用程序,所以我甚至可以手动指定设备的VID和PID 有没有办法

我正在使用连接到Windows PC的条形码扫描仪。它被配置为USB HID设备,这是该扫描仪最可靠的工作模式。我已经开发了一些软件来注册它的输入。问题是,我想让一些程序在后台运行,从条形码扫描仪截取数据,并通过网络发送获得的数据。我已经检查了一些类似的解决方案,但似乎人们大多倾向于使用背景窗口

-这里有一个类似的问题,但答案描述了Java GUI表单的swing KeyListener子级 -也指出了类似的想法

这是一个内部使用的应用程序,所以我甚至可以手动指定设备的VID和PID


有没有办法在没有GUI窗口的情况下读取和截取条形码扫描仪的输入

我使用过的大多数条形码扫描仪都是模拟键盘输入的。您可能会使用原始输入在“后台”读取它,但您可能会发现它会冲击您的“前台”输入。您需要原始输入和低级键盘挂钩的组合。前者可以识别输入的硬件源,但只能对其进行监控。后者无法识别源,但能够拦截输入,防止系统将其传递到目标窗口。一个建议的解决方案是将来自设备的输入存储在原始输入处理程序的列表中,而低级键盘钩子处理输入(如果它与列表中的第一项匹配),然后将其删除。因为所有代码都在同一个线程上运行,所以您不需要任何同步。@i请注意,将原始输入挂钩与键盘挂钩协调起来并不是一件琐碎或可靠的事情,充满了陷阱和警告:@RemyLebeau:这当然不是一件琐碎的事情。您可以做的是检查低级键盘挂钩中是否插入了
LLKHF_
。这允许您区分注入的输入和源自正版键盘设备的键盘。这是基于这样的假设,即扫描仪没有注册为键盘设备(这可能是错误的)。您还可以尝试将
WM_输入
消息的时间戳与钩子过程中的键盘消息关联起来。这也会产生假阳性和假阴性。可靠的解决方案可能需要一个自定义驱动程序。@I从我链接到的文章中可以看出:“当我第一次尝试API组合时,我尝试使用全局低级键盘挂钩(WH_Keyboard_LL)。问题是,当我们使用低级键盘挂钩阻止某些输入时(我们停止消息的进程),Windows不会生成原始输入事件,这意味着任何应用程序都不会获得适当的原始输入消息(WM_Input)。因此,我们不能使用低级键盘挂钩,但我们必须使用标准键盘挂钩(WH_键盘),这一点设置起来有点困难。”