打印
[圈圈教你玩USB]

枚举成键盘和鼠标的共同体?

[复制链接]
4235|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
真水无香|  楼主 | 2009-1-4 01:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在枚举过程中 将设备枚举成了hid 键盘和鼠标。

目前有一个问题,我的鼠标实现是一个电位器,这样它同一时间只能x方向或是y方向移动。

我需要通过pc通知我的这个hid 键盘和鼠标共同体 何时需要x方向移动 何时需要y方向移动,我根据要求 发数据给pc (x轴改变 y轴不变 或是 反之)

不知道 我如何枚举 才能留出这个pc到我设备的数据通道?

是否这时候枚举成hid设备就不行了 必须需要我再人为的定制我自己的驱动,才能实现pc到我设备的数据通道?

如果使用hid还是可行的,那么我如果pc端软件该如何编写呢?

相关帖子

沙发
真水无香|  楼主 | 2009-1-5 10:10 | 只看该作者

顶一下

使用特权

评论回复
板凳
computer00| | 2009-1-6 01:19 | 只看该作者

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

这样就可以枚举成一个键盘和鼠标的设备,当按下键盘上的capslock或者num lock时,进行x轴和y轴的切换。
你的键盘输出报告会收到这个LED的变化情况。这样搞的好处就是不用写一个上位机程序。

当然,你还可以增加一个用户自定义的报告,然后再写一个相应的应用程序。可以参考我blog中的例子。

使用特权

评论回复
地板
xwj| | 2009-1-6 01:31 | 只看该作者

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

自己想用哪个接口发给PC,那还不容易得很?

使用特权

评论回复
5
真水无香|  楼主 | 2009-1-6 14:23 | 只看该作者

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

computer00 看了您blog中的光盘内容,非常期待您的大作 到时肯定要买一本啊。

你给出的第一种方法是借用capslock或者num lock的数据包,请问 在是通用USB键盘时,当操作人员按下Caps lock按键或是Num lock按键后,先是有键盘发送一个数据包给PC,PC收到后,再发送一个关于开关键盘上led指示灯的数据包 对吗?
您的意思是借用这个pc发给键盘的数据包,作为我通知我自己做的键鼠结合体是需要X轴数据还是Y轴数据使用?

我的疑问是,因为驱动是windows自带的,我的程序如何能操作这个驱动呢,用hook 还是?


第二种实现方法
你还可以增加一个用户自定义的报告,然后再写一个相应的应用程序。可以参考我blog中的例子。

请问参考您那个例子呢? 这个报告 能使用您提供的
HID报告描述符生成工具 来生成吗?

to xwj
您说的方法和圈圈说的第二种方法是否类似啊?都需要自己来写个驱动吧?

非常感谢两位。谢谢。

使用特权

评论回复
6
computer00| | 2009-1-6 15:11 | 只看该作者

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

甚至你打开软键盘,然后用鼠标点软键盘上的按键都可以,所以不用自己写一个应用程序来切换。

方案2,也是不用自己写驱动,但是需要自己写一个应用程序。

使用特权

评论回复
7
sz_kd| | 2009-1-6 15:50 | 只看该作者

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

就是xwj方法

使用特权

评论回复
8
真水无香|  楼主 | 2009-1-6 17:24 | 只看该作者

还有些疑问

哎 usb刚刚开始搞 一直想搞usb 多次半途而废了
这次借给圈圈的新书春风 一定要把usb技术给掌握了。

还欠缺上位机的知识,也要一并学习一下。正在安装MinGW,

我找到的usb上位机代码帮助中提示的
Make sure that you have libusb (on Unix) or the DDK (on Windows) installed.
We recommend MinGW on Windows since it includes a free version of the DDK.
Then change to directory "commandline" and run "make" on Unix or
"make -f Makefile.windows" on Windows.


vc6已经安装了很久了,基本没有使用过。

哈哈,有些跑题了,言归正传。


请问圈圈 软键盘也能操作真正键盘的cap lock的灯,那就说 软键盘(紫光输入法带的) 也是调用了系统对键盘的操作的API(不知道这里这么称号是否正确)对吗? 我自己写的上位机程序 同样这样调用,也可以给usb设备发数据了?请问这个API是哪一个呢?


我这里有两张枚举后的设备。



一张就是usb鼠标的 另一个是我下载到的hid设备的。
第二种图 是您提到的 第二种方法的实现吗?


使用特权

评论回复
9
真水无香|  楼主 | 2009-1-6 17:26 | 只看该作者

图片1

使用特权

评论回复
10
真水无香|  楼主 | 2009-1-6 17:34 | 只看该作者

您之前提到第二种方法

也不必自己写驱动 只有自己写应用程序即可?
那是否可以理解为
使用您书中

MyUsbHidTestApp这个例程 修改后,也是可以使用的吧?

xwj方法的方法是否和您提到的第二种方法也类似啊?

枚举后的效果是如8楼图所示的,两个设备 对吗?

谢谢

使用特权

评论回复
11
computer00| | 2009-1-6 18:54 | 只看该作者

是的.

使用特权

评论回复
12
真水无香|  楼主 | 2009-1-7 00:20 | 只看该作者

请问

请问圈圈 软键盘也能操作真正键盘的cap lock的灯,那就说 软键盘(紫光输入法带的) 也是调用了系统对键盘的操作的API(不知道这里这么称号是否正确)对吗? 我自己写的上位机程序 同样这样调用,也可以给usb设备发数据了?请问这个API是哪一个呢?

使用特权

评论回复
13
computer00| | 2009-1-7 00:36 | 只看该作者

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

但是你可以直接模拟发送caps lock的按键。

使用特权

评论回复
14
真水无香|  楼主 | 2009-1-8 00:20 | 只看该作者

有两个地方不明确?

1、现在有黑客软件,可以窃取别人的密码,就是通过截取键盘的数据的。
是否这只是hook,而不是独享这个设备呢?

2、你的意思是 我可以在 直接模拟发送caps lock的按键 上下功夫,
是否是 每次我的键鼠要先发 caps lock的按键被按下的数据询问主机,然后主机再告诉我,是x轴还是y轴。

能否 我pc端直接模拟 回复给键盘关于caps lock的数据呢?

谢谢。

使用特权

评论回复
15
computer00| | 2009-1-8 00:31 | 只看该作者

回复:

1.一般是钩子。当然用过滤驱动也可以。
2.可以直接由PC端的软件发送,就像软键盘那样。

使用特权

评论回复
16
真水无香|  楼主 | 2009-1-8 01:05 | 只看该作者

谢谢 圈圈

请问

可以直接由PC端的软件发送,就像软键盘那样。

这部分资料 能否给推荐些 

谢谢

使用特权

评论回复
17
computer00| | 2009-1-8 02:20 | 只看该作者

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

下面这个函数是我测试过可以正常使用的,输入参数为0时,关闭LED;输入参数为非0时,点亮LED。

void SetCapsLock(BOOL bState) 

 BYTE KeyState[256]; 
 
 //获取当前按键情况
 GetKeyboardState(KeyState);
 //判断当前状态是否跟需要设置的一致,如果不是,
 //则模拟发送一次cpas lock键
 if((bState&&!(KeyState[0x14]&0x01))
  ||(!bState&&(KeyState[0x14]&0x01))) 
  {
   //模拟一次按键按下
   keybd_event(0x14,0x45,0x01,0); 
   //模拟一次按键释放
   keybd_event(0x14,0x45,0x03,0); 
  }
}

使用特权

评论回复
18
真水无香|  楼主 | 2009-1-8 11:35 | 只看该作者

谢谢 圈圈 一直这么热心

我先去消化消化您代码 

应该加到 你光盘中的例程中 应该是可以用的吧

使用特权

评论回复
19
computer00| | 2009-1-8 12:26 | 只看该作者

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

使用特权

评论回复
20
真水无香|  楼主 | 2009-1-8 16:46 | 只看该作者

谢谢 圈圈兄

正在研究

GetKeyboardState
keybd_event



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

67

帖子

0

粉丝