do1st
驱动牛犊
驱动牛犊
  • 注册日期2007-09-15
  • 最后登录2008-07-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:2276回复:8

如何获得USB键盘的输入

楼主#
更多 发布于:2007-09-24 12:20
那位高手指点以下:

我现在已经获得了USB键盘的所有描述符信息,具体如下:
Host Controller \\.\HCD0 found. System name is {36FC9E60-C465-11CF-8056-444553540000}\0004

 Port[2] = I/O device connected
Device Descriptor
  bLength             12
  bDescriptorType     01
  bcdUSB            0110
  bDeviceClass        00
  bDeviceSubClass     00
  bDeviceProtocol     00
  bMaxEP0Size         08
  wVendorID         413c
  wProductID        2003
  wDeviceID         0301
  iManufacturer       01 = Dell
  iProduct            02 = Dell USB Keyboard
  iSerialNumber       00
  bNumConfigurations  01

Configuration Descriptor
  bLength             09
  bDescriptorType     02 = Configuration Header
  wTotalLength      0022
  bNumInterfaces      01
  bConfigValue        01
  iConfiguration      00
  bmAttributes        a0
  bMaxPower           23 = 70 mA

  bLength             09
  bDescriptorType     04 = Interface Descriptor
  bInterfaceNum       00
  bAlternateSetting   00
  bNumEndpoints       01
  bInterfaceClass     03 = Human Interface
  bSubClass           01
  bProtocol           01
  iInterface          00

  bLength             09
  bDescriptorType     21 = HID Descriptor
  wHIDversion       0110
  bCountryCode        00
  bHIDDescriptorCount 01
  bHIDReportType      22
  wHIDReportLength  0041

  bLength             07
  bDescriptorType     05 = Endpoint Descriptor
  bEndpointAddress    81
  bmAttributes        03
  wMaxPacketSize    0008
  bInterval           18

另外还知道 RootHubName  : \\.\USB#ROOT_HUB#4&4fc3f26&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8}

现在我用 CreateFile 生成RootHubHandle:
RootHubHandle = CreateFile(RootHubName, GENERIC_WRITE|GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);  

但问题是:无法用 ReadFile( RootHubHandle , InputReport, nInputReportLen, &TxdBytes, NULL) 读取键盘输入。
lejianz
驱动中牛
驱动中牛
  • 注册日期2003-03-05
  • 最后登录2023-11-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望145点
  • 贡献值0点
  • 好评度116点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2007-09-27 16:24
引用第7楼AllenZh于2007-09-27 15:41发表的  :
USB键盘当然可以打开并得到数据,当然写Filter也可以



AllenZh能说得具体些吗?如何解决设备独占的问题.
一起交流,共同提高!
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-09-27 15:41
USB键盘当然可以打开并得到数据,当然写Filter也可以
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
allanzhou9527
驱动牛犊
驱动牛犊
  • 注册日期2006-03-01
  • 最后登录2008-01-17
  • 粉丝0
  • 关注0
  • 积分710分
  • 威望72点
  • 贡献值0点
  • 好评度71点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-09-27 11:12
引用第2楼do1st于2007-09-24 15:47发表的  :
To allanzhou9527 :
已经获得正确的句柄,这个已经没有问题了。
我先后获得了 HOST Controller,RootHub,Port(Port上就是连接我的USB键盘)。参考USBView,可见我已经获得了全部的信息。但我的问题是我不知道如何使用ReadFile获取键盘输入。
至于CreateFile的句柄问题你可以参考以下这个
http://download.intel.com/intelpress/usb/Examples/ZipFiles/DUSBVC.zip
.......


共勉哈
我原来做的是一个HID 鼠标,所以按照一般的CreateFile是不能获得它的句柄的,更不用说读写。
后来搞了一个USB的游戏手柄了,就可以得到它的句柄了。
反正我最终是要给我的设备送数据,我准备修改Firmware,改成Gamepad类型的设备好了。现在正在研究写应用程序。

我知道USBView的代码中是是从EnumerateHostController开始,然后EnumerateHub,最后EnumerateHubPort来得到设备句柄的,感觉这种方式比较好。现在要赶时间往下做,以后再来看这种方法。你给的代码比USBView的要清晰些,谢谢。

有空加我邮件allanzhou9527@126.com。共同学习哈。
lejianz
驱动中牛
驱动中牛
  • 注册日期2003-03-05
  • 最后登录2023-11-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望145点
  • 贡献值0点
  • 好评度116点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2007-09-26 23:48
不用谢, 能明白就好.
一起交流,共同提高!
do1st
驱动牛犊
驱动牛犊
  • 注册日期2007-09-15
  • 最后登录2008-07-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-09-26 16:57
引用第3楼lejianz于2007-09-25 09:14发表的  :
键盘是系统独占设备, 你是不能用ReadFile来读取数据.如果想得到键盘数据, 得想其它办法.如写过滤驱动.


谢谢,否则我可能在错误的道路上越走越远。
lejianz
驱动中牛
驱动中牛
  • 注册日期2003-03-05
  • 最后登录2023-11-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望145点
  • 贡献值0点
  • 好评度116点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2007-09-25 09:14
键盘是系统独占设备, 你是不能用ReadFile来读取数据.如果想得到键盘数据, 得想其它办法.如写过滤驱动.
一起交流,共同提高!
do1st
驱动牛犊
驱动牛犊
  • 注册日期2007-09-15
  • 最后登录2008-07-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-09-24 15:47
To allanzhou9527 :
已经获得正确的句柄,这个已经没有问题了。
我先后获得了 HOST Controller,RootHub,Port(Port上就是连接我的USB键盘)。参考USBView,可见我已经获得了全部的信息。但我的问题是我不知道如何使用ReadFile获取键盘输入。
至于CreateFile的句柄问题你可以参考以下这个
http://download.intel.com/intelpress/usb/Examples/ZipFiles/DUSBVC.zip

共勉
allanzhou9527
驱动牛犊
驱动牛犊
  • 注册日期2006-03-01
  • 最后登录2008-01-17
  • 粉丝0
  • 关注0
  • 积分710分
  • 威望72点
  • 贡献值0点
  • 好评度71点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-09-24 14:36
先看看用CreateFile是否返回了正确的设备Handle,如果没有用GetLastError()看看错误代码是什么?

帮顶一下吧
我的问题是CreateFile返回的是无效Handle,唉。3天了,还是没有解决。
游客

返回顶部