我正在尝试开发一个设备无关的条码扫描器库,它必须在Windows环境下工作。
我在这个领域做了一些研究,据我所知,大多数解决此问题的方法都依赖于特定设备的VID和PID(在过滤器中使用RawInput @按vid&pid字符串过滤),在我的情况下,这是不可接受的,因为我正在尝试开发一个设备无关的解决方案,可以与任何USB条码扫描器配合使用。
实际上,这件事对我来说相当具有挑战性,以下是确切要求。而且我不能要求用户热插拔设备(在那种情况下,我可以检测到已插入的设备并提取它的vid/pid)。也不能使用设备的VID&PID数据库。总体来说,我实际上不能使用vid&pid。
也不能以任何方式重新编程条码扫描仪,除非从我的程序中完成(也许我可以发送一些条形码扫描仪特定的IOCTLs,使其回答我?)。
目前我将使用此问题中提出的解决方案: Reading a barcode using a USB barcode scanner along with ignoring keyboard data input while scanner product id and vendor id are not known 我还看到了一款商业库(当然没有任何源代码和有关它如何实现的信息,但是考虑到它们在变更日志中使用了一些单词“性能计数器”,我猜测他们使用了上面链接中的解决方案),但它不适用于x64系统。可能是因为代码混乱或者它可能使用了某种过滤(mini)驱动程序。它是加密的,我不能再分发它。
我的确切问题是: 是否有办法确定这个HID键盘实际上不是键盘,而是条形码扫描仪?我在Win 7 x64上看到它连接为条形码扫描仪,而不是键盘(这是一个系统错误,或类似的错误)。
我现在正在做的事情是:
1.通过RID_INPUTSINK读取输入。 2.区分设备vid&pid的所有输入。 3.将所有输入置于单独的缓冲区,并在缓冲区中显示VK_ENTER时从缓冲区收集条码。
更新 0: 刚才发现条形码扫描仪在 USB 规范中有自己的使用页面和用途: http://www.usb.org/developers/devclass_docs/pos1_02.pdf 根据这个文档,USB 条形码扫描器具有 UsagePage 0x8C 和 Usage 0x02。不幸的是,我未能将其用作 RAWINPUTDEVICE.dwUsage 和 RAWINPUTDEVICE.dwUsagePage。可能因为系统安装了其 USB 键盘驱动程序,并且在用户模式下无法区分它与真实的 USB 键盘。也许这些值在内核模式环境中可用(其中一个选项是开发 HID 过滤驱动程序)。
我在这个领域做了一些研究,据我所知,大多数解决此问题的方法都依赖于特定设备的VID和PID(在过滤器中使用RawInput @按vid&pid字符串过滤),在我的情况下,这是不可接受的,因为我正在尝试开发一个设备无关的解决方案,可以与任何USB条码扫描器配合使用。
实际上,这件事对我来说相当具有挑战性,以下是确切要求。而且我不能要求用户热插拔设备(在那种情况下,我可以检测到已插入的设备并提取它的vid/pid)。也不能使用设备的VID&PID数据库。总体来说,我实际上不能使用vid&pid。
也不能以任何方式重新编程条码扫描仪,除非从我的程序中完成(也许我可以发送一些条形码扫描仪特定的IOCTLs,使其回答我?)。
目前我将使用此问题中提出的解决方案: Reading a barcode using a USB barcode scanner along with ignoring keyboard data input while scanner product id and vendor id are not known 我还看到了一款商业库(当然没有任何源代码和有关它如何实现的信息,但是考虑到它们在变更日志中使用了一些单词“性能计数器”,我猜测他们使用了上面链接中的解决方案),但它不适用于x64系统。可能是因为代码混乱或者它可能使用了某种过滤(mini)驱动程序。它是加密的,我不能再分发它。
我的确切问题是: 是否有办法确定这个HID键盘实际上不是键盘,而是条形码扫描仪?我在Win 7 x64上看到它连接为条形码扫描仪,而不是键盘(这是一个系统错误,或类似的错误)。
我现在正在做的事情是:
1.通过RID_INPUTSINK读取输入。 2.区分设备vid&pid的所有输入。 3.将所有输入置于单独的缓冲区,并在缓冲区中显示VK_ENTER时从缓冲区收集条码。
我现在即将要做的事情是:
- 通过RID_INPUTSINK读取输入。
- 为特定设备启动计时器,如果下一个符号是VK_ENTER,则停止计时器。
- 如果计时器超过50毫秒的限制,则关闭它并丢弃所有后续设备输入。
- 如果设备成功从第一个符号到VK_ENTER读取字符序列,则提取设备VID&PID/句柄,并以更方便的方式处理它(无需计时器)。
更新 0: 刚才发现条形码扫描仪在 USB 规范中有自己的使用页面和用途: http://www.usb.org/developers/devclass_docs/pos1_02.pdf 根据这个文档,USB 条形码扫描器具有 UsagePage 0x8C 和 Usage 0x02。不幸的是,我未能将其用作 RAWINPUTDEVICE.dwUsage 和 RAWINPUTDEVICE.dwUsagePage。可能因为系统安装了其 USB 键盘驱动程序,并且在用户模式下无法区分它与真实的 USB 键盘。也许这些值在内核模式环境中可用(其中一个选项是开发 HID 过滤驱动程序)。