阅读:2665回复:15
请教大家,如何探测usb插口上的扫描仪发送来的硬件消息?
如题,谢谢阿
|
|
沙发#
发布于:2005-01-20 16:05
只能开一中断管道,然后driver用一个线程不停的read....
|
|
|
板凳#
发布于:2005-01-28 19:39
用Windows Message的 Device Notification。
|
|
地板#
发布于:2005-02-02 18:37
usb的话 用polling查问比较多吧
|
|
地下室#
发布于:2005-03-24 10:20
这个问题还没解决. 请问还有高手指点我吗??
我的问题是: 按一下扫描仪上的按钮, 我的应用程序捕获到这个按钮事件. 我该如何响应这个事件? 谢谢阿! |
|
5楼#
发布于:2005-03-25 20:57
用一个线程或Timer查询是否按键了/按键的值,然后自己判断处理
或者: 打开中断管道句柄,设置一个event,用一个线程等待event,收到event通知后取出按键值,自己判断处理. 以上中断方式需要你的扫描仪有中断endpoint |
|
6楼#
发布于:2005-03-26 12:01
楼上你好,
1: 我该如何打开中断管道? 打开谁的中断管道? 是扫描仪自带驱动还是windows提供的类驱动的管道?? 2: 设置事件,所使用的函数应该是那些? 3: 扫描仪的\"endpoint\", 是不是指扫描仪驱动要开一个\"endpoint\"? 但是驱动不是我做的, 我该如何知道驱动开了那些\"endpoint\"?? 谢谢你 |
|
7楼#
发布于:2005-03-26 13:37
如果扫描仪本身的按键的实现方式是用USB中断传输方式实现的话,则扫描仪会有一个中断endpoint,在连接到PC后,PC的驱动程序中会有一个中断管道被打开(用于与设备的中断endpoint通讯)
AP可以用CreateFile将该中断管道作为另外的设备去打开,就可以访问它了.访问的方法,请看usbscan.h文件(DDK中). 设置event: CreateEvent, SetEvent, ResetEvent, WaitFor..Object..,等函数 |
|
8楼#
发布于:2005-03-27 13:29
楼上的你好, 我采用的方法就是这样的.
问题1: 我CreateFile(hDevice). 如何确定这个hDevice? 我使用HDEVINFO SetupDiCreateDeviceInfoList 等此类函数得到hDevice, 然后打开. 使用 deviceIocontrol函数, 使用usbscan.h里面的 CTRL_WAIT_ON_EVENT 控制码, 但是操作总是不成功. 返回值是 \"参数无效\". 这是怎么回事?? 问题2: 对于usb扫描仪, App-- sti---驱动. sti作为一个接口层, 是否每个扫描仪程序都兼容实现sti的接口. 经过测试, 我这里2台不同产品的扫描仪都没有实现sti接口. 问题3: 对于问题1, 你有更好的解决办法吗? 是否我使用的参数有问题? 能给我一些例子吗? 谢谢你. 回答后,我会另外开帖给分的. |
|
9楼#
发布于:2005-03-28 10:02
leehan你好, 我已经给你发mail了, 可以讨论一下吗? 我的mail: dupenf@163.com 谢谢你. 另外我会开贴给分的.
|
|
10楼#
发布于:2005-03-28 18:28
这应该是类似usb打印机的打印监视器的东东了
|
|
|
11楼#
发布于:2005-03-29 16:44
sti不是必需的.
把代码贴出来看看 |
|
12楼#
发布于:2005-03-29 18:45
楼上你好, 我得邮箱是 dupenf@163.com 你的是多少??
怎么做还没弄明白, 只有测试代码. 1: 使用 控制码的测试代码: //下面这个值是根据 枚举得到的. char* sz = \"\\\\\\\\?\\\\usb#vid_07b3&pid_0413#5&1a4e37f7&1&3# {6bdd1fc6-810f-11d0-bec7-08002be2092f}\"; hDevice = CreateFile(sz,// \"\\\\\\\\.\\\\device\\\\usbfdo-1\",//sz,//\"\\\\\\\\.\\\\usb\\vid_07b3&pid_0413\", 0, // Access mask FILE_SHARE_READ | FILE_SHARE_WRITE,//0, // Share mode NULL, // SA OPEN_EXISTING, // Create disposition FILE_ATTRIBUTE_SYSTEM|FILE_FLAG_OVERLAPPED, // Attributes NULL ); if (hDevice == INVALID_HANDLE_VALUE) // we can\'t open the drive { dwError = GetLastError(); return (FALSE); } OVERLAPPED Overlapped; memset(&Overlapped,0,sizeof(Overlapped)); Overlapped.hEvent = CreateEvent( NULL, TRUE, TRUE, NULL ); BYTE byInterData[1024]; memset(byInterData,0,sizeof(byInterData)); BOOL bRet = DeviceIoControl( hDevice, (DWORD)IOCTL_WAIT_ON_DEVICE_EVENT, NULL, 0, byInterData, sizeof(byInterData), &junk, (LPOVERLAPPED)&Overlapped); if(bRet) //这里bRet一直返回0, 请问为什么? ........ |
|
13楼#
发布于:2005-03-31 21:51
你没有扫描仪厂商提供的minidriver么?
你用的扫描仪是我公司产的,能告诉我你想用来做什么事情吗?说不定我可以帮助你. 我的邮箱: televixiob@21cn.com |
|
14楼#
发布于:2005-03-31 21:53
地址错了.
televixion@21cn.com |
|
15楼#
发布于:2005-04-01 09:04
地址错了. 我已经给你发mail,收到没有?? 我得是: dupenf@163.com |
|