小编Iva*_*x32的帖子

在不知道VID和PID的情况下读取USB HID条形码扫描器输入

我正在尝试为条形码扫描仪开发独立于设备的库,它必须在Windows环境中工作.

我已经在这个领域做了一些研究,afaik这个问题的大部分解决方案都取决于具体的设备VID和PID(RawInput @ filter by vid&pid string),在我的情况下这是不可接受的,因为我正在尝试开发一个独立的设备解决方案,将与任何USB条形码扫描仪一起使用.

实际上这件事非常具有挑战性,至少对我来说,这里有一些确切的要求.此外,我不能要求用户热插拔设备(在这种情况下,我只能检测插入的设备并提取它的视频/ pid).另外我不能使用设备的VID和PID数据库.一般来说,我实际上根本不能使用vid和pid.

另外我不能以任何方式重新编程条形码扫描仪,除非它是从我的程序完成的(也许我可以发送一些条形码扫描器特定的IOCTL,这将使它回答我?).

目前我将使用此问题中提出的解决方案: 使用USB条形码扫描仪读取条形码,同时忽略键盘数据输入,而扫描仪产品ID和供应商ID未知

此外,我已经看到商业图书馆(这是一个没有任何来源和任何有关如何实施的信息,但考虑到他们在他们的更改日志中有一些单词"Perfomance counter",我猜他们在上面的链接中使用了解决方案),实现此功能,但它在x64系统中不起作用.可能是因为代码混乱或因为它可能使用某种过滤器(迷你)驱动程序.它是加密的,我无法重新分配它.

我的确切问题是: 有没有办法确定这个HID键盘实际上不是键盘,而是条形码扫描仪?我在Win 7 x64上看到它连接的是条码扫描器,而不是键盘(这是一个系统错误,或者某种类型).

正是我现在正在做的事情:

  1. 通过RID_INPUTSINK读取输入.
  2. 通过设备的vid和pid区分所有输入
  3. 当VK_ENTER显示在缓冲区上时,将所有输入放入单独的缓冲区并从缓冲区收集条形码.

我目前要做的是:

  1. 通过RID_INPUTSINK读取输入
  2. 启动特定设备的定时器,如果下一个符号是VK_ENTER - 停止定时器
  3. 如果定时器超过50 ms限制 - 关闭它并丢弃所有进一步的设备输入.
  4. 如果设备将成功读取从第一个符号到VK_ENTER的字符序列 - 提取设备VID和PID /句柄并以更方便的方式使用它(无需定时).

我在C++,纯WinAPI上开发它,它将是一个DLL库,并且可以在x32-86和x32-64架构上的Windows XP,Vista,7,8中工作.

更新0: 刚刚发现条形码扫描器在USB规范中有自己的用法页面和用法:http://www.usb.org/developers/devclass_docs/pos1_02.pdf

根据该文档,USB条形码扫描器具有UsagePage 0x8C和Usage 0x02.不幸的是我没能将它用作RAWINPUTDEVICE.dwUsage和RAWINPUTDEVICE.dwUsagePage.可能是因为系统安装了它的usb键盘驱动程序,在用户模式下,它与真正的USB键盘无法区分.这些值可能在kernelmode环境中可用(其中一个选项是开发hid过滤器驱动程序).

windows 64-bit winapi barcode barcode-scanner

8
推荐指数
1
解决办法
2万
查看次数

标签 统计

64-bit ×1

barcode ×1

barcode-scanner ×1

winapi ×1

windows ×1