python笔记-sendevent/getevent 用法

getevent&sendevent 是android系统下的一个工具,可以 模拟 多种按键和触屏操作,产生的是raw event,raw event经过event hub处理产生最终的gesture事件。

关于event设备的获取,在 /proc/bus/input/devices 下面:

$ adb shell cat /proc/bus/input/devices

=========================

一、getevent

获取getevent 的使用方法 : getevent -h

getevent 监控当前的事件, 鼠标事件, 按键事件, 拖动滑动 以及其他类型的event事件;

使用getevent 获得/dev/input/eventX设备 汇报的事件,这个命令会输出所有event设备的 基本信息,如下:

shell@pc7625:/ $ getevent

add device 1: /dev/input/event6
name: “accel”
add device 2: /dev/input/event5
name: “goodix_ts”
add device 3: /dev/input/event0
name: “Power Button”
add device 4: /dev/input/event1
name: “Video Bus”
add device 5: /dev/input/event4
name: “baytrailaudio Intel MID Audio Jack”
add device 6: /dev/input/event2
name: “gpio-lesskey”
add device 7: /dev/input/event3
name: “dollar_cove_power_button”

表明系统有 7个event设备 ;


在我的android设备里,event2 代表 音量加减按键;

shell@pc7625:/ $ getevent /dev/input/event2 &

点击 音量减按键 :

按键 按下的log :

0001 0072 00000001
0000 0000 00000000

按键 弹起的log :
0001 0072 00000000
0000 0000 00000000

其中/dev/input/event2 是device的名字 ;

0001 是type;

0072 是键码;

最后一个根据type不同而不同;

比如上面的 00000001 就是按下 音量键的keydown,00000000 是松开 音量键的keyup;

具体的type,code,value的定义 可以在源码/frameworks/base/core/java/android/view/KeyEvent.java中找到;

=============================

二、sendevent:

命令格式 : sendevent [device] [type] [code] [value]

需要注意的是在 getevent 中code显示的是十六进制, 而sendevent 中需要用 十进制

1、模拟发送一个 音量加键:
按下 正真的 音量加 按键:

/dev/input/event3: 0001 0073 00000001
/dev/input/event3: 0000 0000 00000000

松开 正真的 音量加 按键:
/dev/input/event3: 0001 0073 00000000
/dev/input/event3: 0000 0000 00000000

------------- 模拟 按键 ------------

发送 按下 音量加 :

shell@anzhen4_mrd7:/ # sendevent /dev/input/event3 1 115 1
shell@anzhen4_mrd7:/ # sendevent /dev/input/event3 0 0 0

发送 松开 音量加 :
shell@anzhen4_mrd7:/ # sendevent /dev/input/event3 1 115 0
shell@anzhen4_mrd7:/ # sendevent /dev/input/event3 0 0 0


type, code, value的定义可参看kernel/include/linux/input.h

type如下定义:
/*

  • 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
    #define EV_SND 0x12
    #define EV_REP 0x14
    #define EV_FF 0x15
    #define EV_PWR 0x16
    #define EV_FF_STATUS 0x17
    #define EV_MAX 0x1f
    #define EV_CNT (EV_MAX+1)
    一般来说,常用的是EV_KEY, EV_REL, EV_ABS, EV_SYN

分别对应keyboard, 相对坐标, 绝对坐标, 同步事件

EV_SYN则表示一组完整事件已经完成,需要处理,EV_SYN的code定义事件分发的类型

EV_SYN对应的code如下:

/*

  • Synchronization events. #同步事件
    */
    #define SYN_REPORT 0 #系统报告
    #define SYN_CONFIG 1 #系统配置
    #define SYN_MT_REPORT 2 #系统翻译报告??

EV_KEY的code比较多,这里就不列出来了,可参照input.h

EV_REL对应的code:

/*

  • Relative axes
    */
    #define REL_X 0x00
    #define REL_Y 0x01
    #define REL_Z 0x02
    #define REL_RX 0x03
    #define REL_RY 0x04
    #define REL_RZ 0x05
    #define REL_HWHEEL 0x06
    #define REL_DIAL 0x07
    #define REL_WHEEL 0x08
    #define REL_MISC 0x09
    #define REL_MAX 0x0f
    #define REL_CNT (REL_MAX+1)

EV_ABS对应的code:

/*

  • Absolute axes
    */

#define ABS_X 0x00
#define ABS_Y 0x01
#define ABS_Z 0x02
#define ABS_RX 0x03
#define ABS_RY 0x04
#define ABS_RZ 0x05
#define ABS_THROTTLE 0x06
#define ABS_RUDDER 0x07
#define ABS_WHEEL 0x08
#define ABS_GAS 0x09
#define ABS_BRAKE 0x0a
#define ABS_HAT0X 0x10
#define ABS_HAT0Y 0x11
#define ABS_HAT1X 0x12
#define ABS_HAT1Y 0x13
#define ABS_HAT2X 0x14
#define ABS_HAT2Y 0x15
#define ABS_HAT3X 0x16
#define ABS_HAT3Y 0x17
#define ABS_PRESSURE 0x18
#define ABS_DISTANCE 0x19
#define ABS_TILT_X 0x1a
#define ABS_TILT_Y 0x1b
#define ABS_TOOL_WIDTH 0x1c
#define ABS_VOLUME 0x20
#define ABS_MISC 0x28

#define ABS_MT_TOUCH_MAJOR 0x30 /* 接触椭圆的长轴 /
#define ABS_MT_TOUCH_MINOR 0x31 /
小轴 (如果圆形忽略) /
#define ABS_MT_WIDTH_MAJOR 0x32 /
长轴的椭圆 /
#define ABS_MT_WIDTH_MINOR 0x33 /
小轴 (如果圆形忽略) /
#define ABS_MT_ORIENTATION 0x34 /
椭圆定位 /
#define ABS_MT_POSITION_X 0x35 /
椭圆中心X位置 /
#define ABS_MT_POSITION_Y 0x36 /
椭圆中心Y位置 /
#define ABS_MT_TOOL_TYPE 0x37 /
触摸设备类型 /
#define ABS_MT_BLOB_ID 0x38 /
Group a set of packets 作为一个包 /
#define ABS_MT_TRACKING_ID 0x39 /
开始接触的惟一ID /
#define ABS_MT_PRESSURE 0x3a /
接触面积的压力 */

#define ABS_MAX 0x3f
#define ABS_CNT (ABS_MAX+1)

三、input keyevent

如果想模拟按键,send event用起来比较繁琐,可以用input keyevent代替

下面是input keyevent几个比较常用的用法:

input keyevent 3 // Home

input keyevent 4 // Back

input keyevent 19 //Up

input keyevent 20 //Down

input keyevent 21 //Left

input keyevent 22 //Right

input keyevent 23 //Select/Ok

input keyevent 24 //Volume+

input keyevent 25 // Volume-

input keyevent 82 // Menu 菜单

更多的按键事件keycode可参考:http://www.cnblogs.com/mgzc-1508873480/p/7826967.html

用senevent 模拟触屏事件

sendevent /dev/input/event1 0003 002f 00000000 #定义第一个按键(我的理解,要想同时按两个按键,可以修改该值)

sendevent /dev/input/event1 0003 0039 00003e20 #开始接触的唯一ID(我的理解,要想同时按两个按键,同上修改该值)

sendevent /dev/input/event1 0003 0000 0000015e // ABS x 坐标

sendevent /dev/input/event1 0003 0001 000000df // ABS y 坐标

sendevent /dev/input/event1 0001 014a 00000001 // BTN 触摸事件 按下值为1

sendevent /dev/input/event1 0003 0018 00000000 // ABS 压力事件

sendevent /dev/input/event1 0000 0000 00000000 // sync同步事件

sendevent /dev/input/event1 0001 014a 00000000 // BTN 触摸事件 松开值为0

sendevent /dev/input/event1 0000 0000 00000000 // sync同步事件

Android 使用 sendevent 模拟鼠标和键盘事件
模拟原理是对驱动发送消息,就是linux里面的input子系统。

命令格式: sendevent /dev/input/eventX [type] [key] [value]

其中/dev/input/eventX 对应的是设备,可以用getevent查看可用设备。

type,key,value这些定义在linux源代码里面的input.h文件里面。

例:发送一个鼠标单击事件

sendevent /dev/input/event0 1 272 1 //1表示发送按键,272是鼠标左键,1表示按下

sendevent /dev/input/event0 0 0 0 //上报事件

sendevent /dev/input/event0 1 272 0

sendevent /dev/input/event0 0 0 0

例2: 发送鼠标右移事件

sendevent /dev/input/event4 2 0 1 //鼠标右移
sendevent /dev/input/event4 0 0 0 //上报事件

而在linux里面也有类似的用法,linux应用可以使用uinput模拟按键。

The Linux 2.6.x provides a “uinput” driver, which helps users to inject data to the Linux kernel.
This is very useful while writing applications to interface customized input devices like wireless
joystick, keyboard etc.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值