如何捕获android系统鼠标轨迹值和键盘值
发布网友
发布时间:2022-04-22 14:35
我来回答
共1个回答
热心网友
时间:2022-05-17 16:28
一、找出设备中,我用的是什么event?
关于该设备打开的是哪个event,我们可以通过命令,cat /proc/bus/input/devices 来查看,执行这个命令后,你会看到您的设备上有多少eventX。
root@lenovo-desktop:~# cat /proc/bus/input/devices
I: Bus=0019 Vendor=0000 Proct=0001 Version=0000
N: Name="Power Button"
P: Phys=PNP0C0C/button/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input0
U: Uniq=
H: Handlers=kbd event0
B: EV=3
B: KEY=100000 0 0 0
I: Bus=0019 Vendor=0000 Proct=0001 Version=0000
N: Name="Power Button"
P: Phys=LNXPWRBN/button/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXPWRBN:00/input/input1
U: Uniq=
H: Handlers=kbd event1
B: EV=3
B: KEY=100000 0 0 0
I: Bus=0017 Vendor=0001 Proct=0001 Version=0100
N: Name="Macintosh mouse button emulation"
P: Phys=
S: Sysfs=/devices/virtual/input/input2
U: Uniq=
H: Handlers=mouse0 event2
B: EV=7
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=3
I: Bus=0011 Vendor=0001 Proct=0001 Version=ab41
N: Name="AT Translated Set 2 keyboard"
P: Phys=isa0060/serio0/input0
S: Sysfs=/devices/platform/i8042/serio0/input/input3
U: Uniq=
H: Handlers=kbd event3
B: EV=120013
B: KEY=4 2000000 3803078 f800d001 feffffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=7
I: Bus=0003 Vendor=17ef Proct=600e Version=0111
N: Name="Lenovo Optical Mouse"
P: Phys=usb-0000:00:1d.1-1/input0
S: Sysfs=/devices/pci0000:00/0000:00:1d.1/usb3/3-1/3-1:1.0/input/input4
U: Uniq=
H: Handlers=mouse1 event4
B: EV=17
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=103
B: MSC=10
?..
?..
我的ubunte系统上敲完这个命令后,能够看到event0—event7,共8个设备。
如上面红色标记,可以很快找出该设备对应的输入设备,以及对应的eventX,跨入眼前视野的“Lenovo Optical Mouse” 这肯定是我鼠标啊,用的牌子就是这个Lenovo,背面上写着呢。
二、对input_event数据结构的解释
标准按键的编码的定义在 linux/input.h中
struct input_event {
struct timeval time; //按键时间
__u16 type; //类型,在下面有定义
__u16 code; //要模拟成什么按键
__s32 value;//是按下还是释放
};
1、code:
事件的代码.如果事件的类型代码是EV_KEY,该代码code为设备键盘代码. 代码植0~127为键盘上的按键代码,
0x110~0x116 为鼠标上按键代码,
其中0x110(BTN_ LEFT)为鼠标左键,
0x111(BTN_RIGHT)为鼠标右键,
0x112(BTN_ MIDDLE)为鼠标中键.
如果事件的类型代码是EV_REL,code值表示轨迹的类型.如指示鼠标的X轴方向REL_X(代码为0x00),指示鼠标的Y轴方向REL_Y(代码 为0x01),指示鼠标中轮子方向REL_WHEEL(代码为0x08).
其它代码含义请参看include/linux/input.h文件.
2、type:
EV_KEY,键盘
EV_REL,相对坐标(轨迹球)
EV_ABS,绝对坐标(鼠标)
。。。
/*
*Event types参考值
*/
#define EV_SYN 0x00
#define EV_KEY 0x01 //按键
#define EV_REL 0x02 //相对坐标(轨迹球)
#define EV_ABS 0x03 //绝对坐标(鼠标)
#define EV_MSC 0x04 //其他
#define EV_SW 0x05
#define EV_LED 0x11 //LED
#define EV_SND 0x12//声音
#define EV_REP 0x14//repeat
#define EV_FF 0x15
#define EV_PWR 0x16
#define EV_FF_STATUS 0x17
#define EV_MAX 0x1f
#define EV_CNT (EV_MAX+1)
3、value:
事件的值.如果事件的类型代码是EV_KEY,当按键按下时值为1,松开时值为0; 如果事件的类型代码是EV_ REL,value的正数值和负数值分别代表两个不同方向的值.
三、抓取event值的原理:
对eventX进行read/write来抓取event的各种信息;
1、打开event设备
event0_fd = open(“/dev/input/event0”, O_RDWR);
2、read 设备
rd = read(event0_fd, &event0, sizeof(struct input_event) * 64);