[圈圈教你玩USB] 枚举成键盘和鼠标的共同体?

[复制链接]
5405|20
 楼主| 真水无香 发表于 2009-1-4 01:35 | 显示全部楼层 |阅读模式
在枚举过程中&nbsp;将设备枚举成了hid&nbsp;键盘和鼠标。<br /><br />目前有一个问题,我的鼠标实现是一个电位器,这样它同一时间只能x方向或是y方向移动。<br /><br />我需要通过pc通知我的这个hid&nbsp;键盘和鼠标共同体&nbsp;何时需要x方向移动&nbsp;何时需要y方向移动,我根据要求&nbsp;发数据给pc&nbsp;(x轴改变&nbsp;y轴不变&nbsp;或是&nbsp;反之)<br /><br />不知道&nbsp;我如何枚举&nbsp;才能留出这个pc到我设备的数据通道?<br /><br />是否这时候枚举成hid设备就不行了&nbsp;必须需要我再人为的定制我自己的驱动,才能实现pc到我设备的数据通道?<br /><br />如果使用hid还是可行的,那么我如果pc端软件该如何编写呢?
 楼主| 真水无香 发表于 2009-1-5 10:10 | 显示全部楼层

顶一下

  
computer00 发表于 2009-1-6 01:19 | 显示全部楼层

你看这样行不?使用大写字母锁定或者数字键盘锁定来切换

这样就可以枚举成一个键盘和鼠标的设备,当按下键盘上的capslock或者num&nbsp;lock时,进行x轴和y轴的切换。<br />你的键盘输出报告会收到这个LED的变化情况。这样搞的好处就是不用写一个上位机程序。<br /><br />当然,你还可以增加一个用户自定义的报告,然后再写一个相应的应用程序。可以参考我blog中的例子。
xwj 发表于 2009-1-6 01:31 | 显示全部楼层

同时枚举成2个设备,然后PC向任意一个发切换指令都会切换

自己想用哪个接口发给PC,那还不容易得很?
 楼主| 真水无香 发表于 2009-1-6 14:23 | 显示全部楼层

谢谢 两位的回复 还有如下疑问?谢谢

computer00&nbsp;看了您blog中的光盘内容,非常期待您的大作&nbsp;到时肯定要买一本啊。<br /><br />你给出的第一种方法是借用capslock或者num&nbsp;lock的数据包,请问&nbsp;在是通用USB键盘时,当操作人员按下Caps&nbsp;lock按键或是Num&nbsp;lock按键后,先是有键盘发送一个数据包给PC,PC收到后,再发送一个关于开关键盘上led指示灯的数据包&nbsp;对吗?<br />您的意思是借用这个pc发给键盘的数据包,作为我通知我自己做的键鼠结合体是需要X轴数据还是Y轴数据使用?<br /><br />我的疑问是,因为驱动是windows自带的,我的程序如何能操作这个驱动呢,用hook&nbsp;还是?<br /><br /><br />第二种实现方法<br />你还可以增加一个用户自定义的报告,然后再写一个相应的应用程序。可以参考我blog中的例子。<br /><br />请问参考您那个例子呢?&nbsp;这个报告&nbsp;能使用您提供的<br />HID报告描述符生成工具&nbsp;来生成吗?<br /><br />to&nbsp;xwj<br />您说的方法和圈圈说的第二种方法是否类似啊?都需要自己来写个驱动吧?<br /><br />非常感谢两位。谢谢。
computer00 发表于 2009-1-6 15:11 | 显示全部楼层

至于LED状态切换,连接在你的PC机上的任意一块键盘都可以

甚至你打开软键盘,然后用鼠标点软键盘上的按键都可以,所以不用自己写一个应用程序来切换。<br /><br />方案2,也是不用自己写驱动,但是需要自己写一个应用程序。
sz_kd 发表于 2009-1-6 15:50 | 显示全部楼层

我们做的鼠标都带有键盘功能

就是xwj方法
 楼主| 真水无香 发表于 2009-1-6 17:24 | 显示全部楼层

还有些疑问

哎&nbsp;usb刚刚开始搞&nbsp;一直想搞usb&nbsp;多次半途而废了<br />这次借给圈圈的新书春风&nbsp;一定要把usb技术给掌握了。<br /><br />还欠缺上位机的知识,也要一并学习一下。正在安装MinGW,<br /><br />我找到的usb上位机代码帮助中提示的<br />Make&nbsp;sure&nbsp;that&nbsp;you&nbsp;have&nbsp;libusb&nbsp;(on&nbsp;Unix)&nbsp;or&nbsp;the&nbsp;DDK&nbsp;(on&nbsp;Windows)&nbsp;installed.<br />We&nbsp;recommend&nbsp;MinGW&nbsp;on&nbsp;Windows&nbsp;since&nbsp;it&nbsp;includes&nbsp;a&nbsp;free&nbsp;version&nbsp;of&nbsp;the&nbsp;DDK.<br />Then&nbsp;change&nbsp;to&nbsp;directory&nbsp;&quot;commandline&quot;&nbsp;and&nbsp;run&nbsp;&quot;make&quot;&nbsp;on&nbsp;Unix&nbsp;or<br />&quot;make&nbsp;-f&nbsp;Makefile.windows&quot;&nbsp;on&nbsp;Windows.<br /><br /><br />vc6已经安装了很久了,基本没有使用过。<br /><br />哈哈,有些跑题了,言归正传。<br /><br /><br />请问圈圈&nbsp;软键盘也能操作真正键盘的cap&nbsp;lock的灯,那就说&nbsp;软键盘(紫光输入法带的)&nbsp;也是调用了系统对键盘的操作的API(不知道这里这么称号是否正确)对吗?&nbsp;我自己写的上位机程序&nbsp;同样这样调用,也可以给usb设备发数据了?请问这个API是哪一个呢?<br /><br /><br />我这里有两张枚举后的设备。<br /><br /><br /><br />一张就是usb鼠标的&nbsp;另一个是我下载到的hid设备的。<br />第二种图&nbsp;是您提到的&nbsp;第二种方法的实现吗?<br /><br /><br />
 楼主| 真水无香 发表于 2009-1-6 17:26 | 显示全部楼层
 楼主| 真水无香 发表于 2009-1-6 17:34 | 显示全部楼层

您之前提到第二种方法

也不必自己写驱动&nbsp;只有自己写应用程序即可?<br />那是否可以理解为<br />使用您书中<br /><br />MyUsbHidTestApp这个例程&nbsp;修改后,也是可以使用的吧?<br /><br />xwj方法的方法是否和您提到的第二种方法也类似啊?<br /><br />枚举后的效果是如8楼图所示的,两个设备&nbsp;对吗?<br /><br />谢谢
computer00 发表于 2009-1-6 18:54 | 显示全部楼层

是的.

  
 楼主| 真水无香 发表于 2009-1-7 00:20 | 显示全部楼层

请问

请问圈圈&nbsp;软键盘也能操作真正键盘的cap&nbsp;lock的灯,那就说&nbsp;软键盘(紫光输入法带的)&nbsp;也是调用了系统对键盘的操作的API(不知道这里这么称号是否正确)对吗?&nbsp;我自己写的上位机程序&nbsp;同样这样调用,也可以给usb设备发数据了?请问这个API是哪一个呢?
computer00 发表于 2009-1-7 00:36 | 显示全部楼层

键盘设备是windows独享的设备,你自己写个程序无法打开它。

但是你可以直接模拟发送caps&nbsp;lock的按键。
 楼主| 真水无香 发表于 2009-1-8 00:20 | 显示全部楼层

有两个地方不明确?

1、现在有黑客软件,可以窃取别人的密码,就是通过截取键盘的数据的。<br />是否这只是hook,而不是独享这个设备呢?<br /><br />2、你的意思是&nbsp;我可以在&nbsp;直接模拟发送caps&nbsp;lock的按键&nbsp;上下功夫,<br />是否是&nbsp;每次我的键鼠要先发&nbsp;caps&nbsp;lock的按键被按下的数据询问主机,然后主机再告诉我,是x轴还是y轴。<br /><br />能否&nbsp;我pc端直接模拟&nbsp;回复给键盘关于caps&nbsp;lock的数据呢?<br /><br />谢谢。
computer00 发表于 2009-1-8 00:31 | 显示全部楼层

回复:

1.一般是钩子。当然用过滤驱动也可以。<br />2.可以直接由PC端的软件发送,就像软键盘那样。
 楼主| 真水无香 发表于 2009-1-8 01:05 | 显示全部楼层

谢谢 圈圈

请问<br /><br />可以直接由PC端的软件发送,就像软键盘那样。<br /><br />这部分资料&nbsp;能否给推荐些&nbsp;<br /><br />谢谢
computer00 发表于 2009-1-8 02:20 | 显示全部楼层

可以调用keybd_event API函数来模拟发送caps lock键

下面这个函数是我测试过可以正常使用的,输入参数为0时,关闭LED;输入参数为非0时,点亮LED。<br /><br />void&nbsp;SetCapsLock(BOOL&nbsp;bState)&nbsp;<br />{&nbsp;<br />&nbsp;BYTE&nbsp;KeyState[256];&nbsp;<br />&nbsp;<br />&nbsp;//获取当前按键情况<br />&nbsp;GetKeyboardState(KeyState);<br />&nbsp;//判断当前状态是否跟需要设置的一致,如果不是,<br />&nbsp;//则模拟发送一次cpas&nbsp;lock键<br />&nbsp;if((bState&&!(KeyState[0x14]&0x01))<br />&nbsp;&nbsp;||(!bState&&(KeyState[0x14]&0x01)))&nbsp;<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;//模拟一次按键按下<br />&nbsp;&nbsp;&nbsp;keybd_event(0x14,0x45,0x01,0);&nbsp;<br />&nbsp;&nbsp;&nbsp;//模拟一次按键释放<br />&nbsp;&nbsp;&nbsp;keybd_event(0x14,0x45,0x03,0);&nbsp;<br />&nbsp;&nbsp;}<br />}
 楼主| 真水无香 发表于 2009-1-8 11:35 | 显示全部楼层

谢谢 圈圈 一直这么热心

我先去消化消化您代码&nbsp;<br /><br />应该加到&nbsp;你光盘中的例程中&nbsp;应该是可以用的吧
computer00 发表于 2009-1-8 12:26 | 显示全部楼层

这个跟USB是无关的,任何键盘都可以用它来操作

  
 楼主| 真水无香 发表于 2009-1-8 16:46 | 显示全部楼层

谢谢 圈圈兄

正在研究<br /><br />GetKeyboardState<br />keybd_event<br /><br />中<br /><br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

67

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部