下载ADB位置:/download/qq_42095701/16078245
Python脚本利用adb进行手机控制的方法
一. adb 相关命令:
1. 关闭adb服务:adb kill-server
2. 启动adb服务 adb start-server
3. 查询当前运行的所有设备 adb devices
4. 可能在adb中存在多个虚拟设备运行 可以指定虚拟设备运行 -s 虚拟设备名称
5. 重启设备 adb reboot --指定虚拟设备 adb -s 设备名称 reboot
6. 查看日志 adb logcat 清除日志 adb logcat -c
7. 进入linux shell下 adb shell 其中常用的linux命令 cd cat 等等 输入su可以获取超级管理员名称了 要确定是否有哪些命令 进入 system/bin目录 就知道了
8. 传入文件到设备中 adb push 本地文件 远程目录
9. 从设备中拷贝文件到本地 adb -s emulator-5556 pull /data/ d:/
10. 显示当前运行的全部模拟器:
adb devices
1 安装应用程序:
adb install -r
12. 获取模拟器中的文件:
adb pull <remote> <local>
13. 向模拟器中写文件:
adb push <local> <remote>
14. 进入模拟器的shell模式:
adb shell
15. 卸载apk包:
adb shell
cd data/app
rm
exit
adb uninstall
adb install -r
16. 查看adb命令帮助信息:
adb help
17. 删除系统应用:
adb remount (重新挂载系统分区,使系统分区重新可写)。
adb shell
cd system/app
rm
18. 获取管理员权限:
adb root
19、复制文件:
复制一个文件或目录到设备:
adb push <source> <destination></destination></source>
如:adb push /sdcard/
从设备上复制一个文件或目录:
adb pull <source> <destination></destination></source>
如:adb pull /sdcard/.
20、取得当前运行设备的实例的列表及每个实例的状态:
adb devices
21:adb shell input tap
这条命令模拟Android手机在屏幕坐标(X,Y)处进行了点击操作。
22:adb shell input swipe
这条命令模拟Android手机从屏幕坐标(X1,Y1)滑动到坐标(X2,Y2)的操作。
23、uiautomator dump dump: creates an XML dump of current UI hierarchy 这个命令是用来成成当前界面的UI层次,并用XML格式进行展示 。这样就可以获取各个组件的位置了
注:如果PC要想同时控制多台Android手机,必须在adb 后面添加-s
例如:adb -s 13b6e4c4 shell input tap 400 400
表示对13b6e4c4这台Android手机进行在屏幕上(400,400)坐标位置进行模拟的点击事件。
24. 能看到设备信息就代表设备已经连接成功了,接下来的命令就是adb install 路径+包名.apk
例如我的安装包放在桌面,那么命令就是adb install C:\Users\hyh\Desktop\
*** adb shell uiautomator dump /mnt/sdcard/window_dump.xml 获得手机当前界面的UI信息,生成window_dump.xml
*** adb shell input text “123” 输入text
举例:
1、打开cmd,进入到当前文件夹中,输入命令 adb devices 查看当前与电脑连接的设备(前提是,手机打开usb调试模式),可以查看已连接成功的手机。
2、 若手机成功连接,输入命令 adb shell input tap 100 100 , 表示点击屏幕上坐标为(100,100)的点,如果不知道需要点击的点的具体位置的话可以在手机开发者模式中设置。
管理设备
1 2 3 4 5 6 7 8 9 10 11 12 |
|
adb相关
1 2 3 4 |
|
获取设备硬件信息
1 2 |
|
管理设备app
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
文件操作
//android中,sdcard代表内置存储,不同系统中tf卡的设备名可能不同,使用查看adb shell ls mnt查看所有存储设备名。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
简记版
获取序列号:
adb get-serialno
查看连接计算机的设备:
adb devices
重启机器:
adb reboot
重启到bootloader,即刷机模式:
adb reboot bootloader
重启到recovery,即恢复模式:
adb reboot recovery
查看log:
adb logcat
终止adb服务进程:
adb kill-server
重启adb服务进程:
adb start-server
获取机器MAC地址:
adb shell cat /sys/class/net/wlan0/address
获取CPU序列号:
adb shell cat /proc/cpuinfo
安装APK:
adb install <apkfile> //比如:adb install
保留数据和缓存文件,重新安装apk:
adb install -r <apkfile> //比如:adb install -r
安装apk到sd卡:
adb install -s <apkfile> // 比如:adb install -s
卸载APK:
adb uninstall <package> //比如:adb uninstall
卸载app但保留数据和缓存文件:
adb uninstall -k <package> //比如:adb uninstall -k
启动应用:
adb shell am start -n <package_name>/.<activity_class_name>
查看设备cpu和内存占用情况:
adb shell top
查看占用内存前6的app:
adb shell top -m 6
刷新一次内存信息,然后返回:
adb shell top -n 1
查询各进程内存使用情况:
adb shell procrank
杀死一个进程:
adb shell kill [pid]
查看进程列表:
adb shell ps
查看指定进程状态:
adb shell ps -x [PID]
查看后台services信息:
adb shell service list
查看当前内存占用:
adb shell cat /proc/meminfo
查看IO内存分区:
adb shell cat /proc/iomem
将system分区重新挂载为可读写分区:
adb remount
从本地复制文件到设备:
adb push <local> <remote>
从设备复制文件到本地:
adb pull <remote> <local>
列出目录下的文件和文件夹,等同于dos中的dir命令:
adb shell ls
进入文件夹,等同于dos中的cd 命令:
adb shell cd <folder>
重命名文件:
adb shell rename path/oldfilename path/newfilename
删除system/:
adb shell rm /system/
删除文件夹及其下面所有文件:
adb shell rm -r <folder>
移动文件:
adb shell mv path/file newpath/file
设置文件权限:
adb shell chmod 777 /system/fonts/
新建文件夹:
adb shell mkdir path/foldelname
查看文件内容:
adb shell cat <file>
查看wifi密码:
adb shell cat /data/misc/wifi/*.conf
清除log缓存:
adb logcat -c
查看bug报告:
adb bugreport
获取设备名称:
adb shell cat /system/
查看ADB帮助:
adb help
跑monkey:
adb shell monkey -v -p 500
二. adb 模拟按键:
1. 比如使用 adb shell input keyevent <keycode> 命令,不同的 keycode 能实现不同的功能,完整的 keycode 列表详见 KeyEvent,摘引部分我觉得有意思的如下:
keycode | 含义 |
---|---|
3 | HOME 键 |
4 | 返回键 |
5 | 打开拨号应用 |
6 | 挂断电话 |
24 | 增加音量 |
25 | 降低音量 |
26 | 电源键 |
27 | 拍照(需要在相机应用里) |
64 | 打开浏览器 |
82 | 菜单键 |
85 | 播放/暂停 |
86 | 停止播放 |
87 | 播放下一首 |
88 | 播放上一首 |
122 | 移动光标到行首或列表顶部 |
123 | 移动光标到行末或列表底部 |
126 | 恢复播放 |
127 | 暂停播放 |
164 | 静音 |
176 | 打开系统设置 |
187 | 切换应用 |
207 | 打开联系人 |
208 | 打开日历 |
209 | 打开音乐 |
210 | 打开计算器 |
220 | 降低屏幕亮度 |
221 | 提高屏幕亮度 |
223 | 系统休眠 |
224 | 点亮屏幕 |
231 | 打开语音助手 |
276 | 如果没有 wakelock 则让系统休眠 |
2. input 命令的一些用法举例
电源键
命令:
adb shell input keyevent 26
执行效果相当于按电源键。
菜单键
命令:
adb shell input keyevent 82
HOME 键
命令:
adb shell input keyevent 3
返回键
命令:
adb shell input keyevent 4
音量控制
增加音量:
adb shell input keyevent 24
降低音量:
adb shell input keyevent 25
静音:
adb shell input keyevent 164
媒体控制
播放/暂停:
adb shell input keyevent 85
停止播放:
adb shell input keyevent 86
播放下一首:
adb shell input keyevent 87
播放上一首:
adb shell input keyevent 88
恢复播放:
adb shell input keyevent 126
暂停播放:
adb shell input keyevent 127
点亮/熄灭屏幕
可以通过上文讲述过的模拟电源键来切换点亮和熄灭屏幕,但如果明确地想要点亮或者熄灭屏幕,那可以使用如下方法。
点亮屏幕:
adb shell input keyevent 224
熄灭屏幕:
adb shell input keyevent 223
三、使用python脚本自动运行cmd 命令
在adb文件夹下建立一个python文件
import os
('adb shell input tap 100 100');
运行脚本,发现与在命令行输入相同语句有同样的效果。
2、也可以使用,最简单使用方式如下,设置shell=True,就不会弹出cmd框
process = ('adb shell input tap 14 1402',shell=True)
程序实例:
#coding:utf-8
#程序功能:可以实现抖音个人页面视频的自动点击,从而自动增加访问量
#思路:抖音主页中两个视频切换点击,可以实现访问量的增加
#使用ADB程序,视频的屏幕坐标可以使用adb shell uiautomator dump命令,获取该页面xml源码后查得
#下述是小米MIX2抖音主页第一个视频和第二个视频的坐标位置
#缺点:运行时不能移动屏幕,后续可以采用获取模块ID号的方式去点击相应的位置
import time
import subprocess
i = 0
#每次操作的间隔时间取决于手机配置,配置越高时间越短
sleep_time = 0.5
while 1:
#用popen设置shell=True不会弹出cmd框
process = ('adb shell input tap 14 1402',shell=True)
(sleep_time)
process = ('adb shell input keyevent KEYCODE_BACK', shell=True)
(sleep_time)
process = ('adb shell input tap 375 1402', shell=True)
(sleep_time)
process = ('adb shell input keyevent KEYCODE_BACK', shell=True)
(sleep_time)
#('adb shell input tap 14 1402')
#('adb shell input keyevent KEYCODE_BACK')
#('adb shell input tap 375 1402')
i+=1
print str(i) + 'clicks have been completed'
adb shell svc wifi enable 启动无线
adb shell svc wifi disable 关闭无线
adb shell svc data enable 启动移动网络
adb shell svc data disable 关闭移动网络
********************************************************************************************************************************* ********************************************************************************************************************************* ********************************************************************************************************************************* *********************************************************************************************************************************
强大的查询功能
使用命令adb shell getprop +下面的属性,即可获取相应的属性
属性名 //含义
SDK //版本
Android //系统版本
//型号
//品牌
//设备名
查看内存消息指令
1 adb shell dumpsys meminfo # 查看整个设备的内存信息
2 adb shell dumpsys meminfo pid # 查看指定进程的内存信息
3 adb shell dumpsys meminfo # 查看指定应用的内存信息
4 bash:bash shell
5 dalvik:是指dalvik所使用的内存。 native:是被native堆使用的内存。应该指使用C\C++在堆上分配的内存。 VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
6 VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
7 RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存)
8 PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
9 USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
10一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
dumpsys 获取系统数据
获取当前运行的 activity
adb shell dumpsys activity | findstr Run
获取apk版本号、权限等信息的方法
adb shell dumpsys package (包名)
举例: 以查询微信版本为例
adb shell dumpsys package
获取apk版本号、权限等信息的方法
adb shell dumpsys package (包名)
举例: 以查询微信版本为例
adb shell dumpsys package > /home/jiatai/Android/dumpsys/weixin
权限分两段:
第一段(看起来都是自定义权限)
Permissions:
Permission [] (6ef054e):
sourcePackage=
uid=10138 gids=null type=0 prot=signature
perm=Permission{fb7366f }
packageSetting=PackageSetting{c722f7c /10138}
Permission [.MM_MESSAGE] (cfe3005):
sourcePackage=
uid=10138 gids=null type=0 prot=signature
perm=Permission{3ba285a .MM_MESSAGE}
packageSetting=PackageSetting{c722f7c /10138}
Permission [] (e2aca8b):
sourcePackage=
uid=10138 gids=null type=0 prot=signature
perm=Permission{470c768 }
packageSetting=PackageSetting{c722f7c /10138}
Permission [] (336c781):
sourcePackage=
uid=10138 gids=null type=0 prot=signature
perm=Permission{de27026 }
packageSetting=PackageSetting{c722f7c /10138}
Permission [] (af98467):
sourcePackage=
uid=10138 gids=null type=0 prot=normal
perm=Permission{13ef214 }
packageSetting=PackageSetting{c722f7c /10138}
Permission [] (5075abd):
sourcePackage=
uid=10138 gids=null type=0 prot=signature|privileged
perm=Permission{cf568b2 }
packageSetting=PackageSetting{c722f7c /10138}
Permission [.C2D_MESSAGE] (6100003):
sourcePackage=
uid=10138 gids=null type=0 prot=signature
perm=Permission{a231b80 .C2D_MESSAGE}
packageSetting=PackageSetting{c722f7c /10138}
Permission [] (853e5b9):
sourcePackage=
uid=10138 gids=null type=0 prot=signature
perm=Permission{1cd5dfe }
packageSetting=PackageSetting{c722f7c /10138}
Permission [] (788995f):
sourcePackage=
uid=10138 gids=null type=0 prot=signature|privileged
perm=Permission{25e6fac }
packageSetting=PackageSetting{c722f7c /10138}
第二段(很全的权限列表了):
declared permissions:
: prot=signature, INSTALLED
: prot=signature, INSTALLED
.MM_MESSAGE: prot=signature, INSTALLED
: prot=signature|privileged, INSTALLED
: prot=signature|privileged, INSTALLED
: prot=normal, INSTALLED
: prot=signature, INSTALLED
.C2D_MESSAGE: prot=signature, INSTALLED
: prot=signature, INSTALLED
requested permissions:
.CHANGE_WIFI_MULTICAST_STATE
.MM_MESSAGE
.HW_ACCESS_AUTH_SERVICE
.ACCESS_NETWORK_STATE
.ACCESS_COARSE_LOCATION
.ACCESS_FINE_LOCATION
.GET_TASKS
.MODIFY_AUDIO_SETTINGS
.RECEIVE_BOOT_COMPLETED
.RECORD_AUDIO
.READ_CONTACTS
.READ_SMS
.WAKE_LOCK
.WRITE_EXTERNAL_STORAGE
.WRITE_CONTACTS
.WRITE_SETTINGS
.INSTALL_SHORTCUT
.UNINSTALL_SHORTCUT
.READ_SETTINGS
.SEND_VIEW
.BLUETOOTH_ADMIN
.BROADCAST_STICKY
.SYSTEM_ALERT_WINDOW
.CHANGE_WIFI_STATE
.GET_PACKAGE_SIZE
.DOWNLOAD_WITHOUT_NOTIFICATION
.CHANGE_BADGE
.WRITE_APP_BADGE
.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
.READ_PHONE_STATE
.READ_EXTERNAL_STORAGE
.ACCESS_WIFI_STATE
.BODY_SENSORS
.
.GET_ACCOUNTS
.C2D_MESSAGE
.MANAGE_ACCOUNTS
.AUTHENTICATE_ACCOUNTS
.READ_SYNC_SETTINGS
.WRITE_SYNC_SETTINGS
.READ_PROFILE
.USE_FINGERPRINT
install permissions:
.DOWNLOAD_WITHOUT_NOTIFICATION: granted=true
.MODIFY_AUDIO_SETTINGS: granted=true
.MANAGE_ACCOUNTS: granted=true
: granted=true
: granted=true
.WRITE_SYNC_SETTINGS: granted=true
.RECEIVE_BOOT_COMPLETED: granted=true
.MM_MESSAGE: granted=true
.UNINSTALL_SHORTCUT: granted=true
.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS: granted=true
.READ_PROFILE: granted=true
: granted=true
.CHANGE_WIFI_MULTICAST_STATE: granted=true
.GET_TASKS: granted=true
.AUTHENTICATE_ACCOUNTS: granted=true
: granted=true
.BLUETOOTH_ADMIN: granted=true
.GET_PACKAGE_SIZE: granted=true
: granted=true
: granted=true
: granted=true
.READ_SETTINGS: granted=true
.BROADCAST_STICKY: granted=true
.CHANGE_WIFI_STATE: granted=true
.ACCESS_NETWORK_STATE: granted=true
.C2D_MESSAGE: granted=true
.USE_FINGERPRINT: granted=true
.READ_SYNC_SETTINGS: granted=true
: granted=true
: granted=true
.ACCESS_WIFI_STATE: granted=true
.INSTALL_SHORTCUT: granted=true
.WAKE_LOCK: granted=true
: granted=true
User 0: ceDataInode=1425553 installed=true hidden=false suspended=false stopped=false notLaunched=false enabled=0 instant=false
gids=[3002, 3003, 3001]
runtime permissions:
.ACCESS_FINE_LOCATION: granted=true
.BODY_SENSORS: granted=true
.READ_EXTERNAL_STORAGE: granted=true
.ACCESS_COARSE_LOCATION: granted=true
.READ_PHONE_STATE: granted=true
.WRITE_CONTACTS: granted=true
: granted=true
.GET_ACCOUNTS: granted=true
.WRITE_EXTERNAL_STORAGE: granted=true
.RECORD_AUDIO: granted=true
.READ_CONTACTS: granted=true
disabledComponents:
.nfc_open.
权限概念
从上面dumpsys package 微信的结果来看我们可以抽象出下面四个权限概念:
declared permissions :自定义权限
requested permissions :请求权限
install permissions :安装权限
runtime permissions : 运行时权限
declared permissions
自定义权限作用:与其他应用分享自己的资源和功能
(By defining custom permissions, an app can share its resources and capabilities with other apps. )
为了创建自定义权限,你需要在你应用的里用一个或多个<permission>来声明。
比如说,一个应用想控制启动它的activity对象,那么可以像下面一个声明一个自定义权限:
<manifest
xmlns:andro
package="" >
<permission
android:name=".DEADLY_ACTIVITY"
android:label="@string/permlab_deadlyActivity"
android:description="@string/permdesc_deadlyActivity"
android:permissionGroup="-group.COST_MONEY"
android:protectionLevel="dangerous" />
...
</manifest>
注意: 系统不允许许多应用声明相同的自定义权限,除非这些应用有相同的签名。如果一个包声明了一个权限,那么系统不允许用户安装其他声明该权限的应用,除非其他应用和第一个应用有相同的签名。为了避免命名冲突,我们推荐使用reverse-domain-style命名规则,
比如说
.ENGAGE_HYPERSPACE。
protectionLevel:这个属性是必须的,告知系统如何提醒用户需要该权限的应用,或者谁允许来持有该权限。
permissionGroup:这个属性是可选的,只被用来帮助系统呈现权限给用户。在大多数情况,你应该将其设置为一个标准的系统权限组(在.permission_group中列出的),虽然你可以自己定义一个权限组,但是我们更建议使用存在的权限组,因为可以简化呈现给用户的UI。
label和description:你需要为自定义权限提供label和description。这些都是用户可以看到的字符串资源,label对应于标签,description对应于权限细节。label建议写的短一些,而description建议为几句话描述一下权限允许持有者可以做什么。我们推荐两段式描述,第一句描述一下权限,第二句描述一下如果应用获取了对应权限会有什么风险。
下面是一个CALL_PHONE的例子:
<string name="permlab_callPhone">directly call phone numbers</string>
<string name="permdesc_callPhone">Allows the app to call
phone numbers without your intervention. Malicious apps may
cause unexpected calls on your phone bill. Note that this does not
allow the app to call emergency numbers.</string>
应用可以通过使用<uses-permission>来定义自定义权限和请求其他应用定义的权限。但是,你最好仔细评估是否需要这么做。
如果你这在设置一套暴露功能给其他应用的应用。如果这些应用没有相同的签名,那么每个权限仅会也仅能被定义一次。及时应用都具有相同的签名,我们也建议每个权限仅被定义一次。
如果功能只对具有相同签名的apps开放,那么你应用通过签名检查来避免自定义权限。当其中一个app请求你的其他app的时候,第二个app在应答请求之前可以校验一下两个app是否具有同样的签名。
如果你正在开发只在你自己设备上的app,你应该为你的apps开发并安装一个管理权限的包。这个包不需要提供任何服务,它仅仅声明所有的权限,并且其他应用使用<uses-permission>请求这些权限。
requested permissions
看起来是应用所需权限的集合,
包含其他权限成分,即
declared permissions :自定义权限
install permissions :安装权限
runtime permissions :运行时权限
install permissions 和 runtime permissions
我是这么理解的,Android 6.0之前的manifest里包含的所有权限声明都可以当做install permissions,Android 6.0即以后manifest里除了dangerous permissions即runtime permissions外则属于install permissions。
总结
简单看起来权限分为三大块,自定义权限、正常权限和危险权限(或者说运行时权限),运行时权限比较特殊,在Android 6.0 以后应用需要在使用时弹框请求。
查看手机的进程 process
使用 top
命令查看系统进程
adb shell top
使用 ps
命令查看系统进程
adb shell ps
结合 findstr
命令过滤多余的信息,
以微信为例
adb shell ps | findstr mm
以手机qq为例
adb shell ps | findstr qq
输入法相关
获取已安装所有输入法
adb shell ime list -s
获取当前设备输入法
adb shell settings get secure default_input_method
设置输入法
adb shell ime set /input
# 或者
adb shell settings put secure default_input_method /input
电量管理相关命令
模拟拔下设备电源
adb shell dumpsys battery unplug
低电量条件下的行为
adb shell settings put global low_power 1
恢复电源修改
adb shell dumpsys battery reset
使用 adb 命令进入 recovery
模式
进入Recovery 模式可以使用组合键,
也可以使用adb 命令 adb 命令进入recovery 模式如下
adb reboot recovery
启动、跳过 Google 开机向导:
跳过
1 adb shell pm disable
2 adb shell settings put global device_provisioned 1
3 adb shell settings put secure user_setup_complete 1
启动
adb shell am start /.
看CPU信息
# 登陆到设备环境
adb shell
# 查看cpu信息
cat /proc/cpuinfo
可能看到以下的cpu版本:
arm32位
ARMv7
ARMv7s
arm64位
AArch64
ARMv8
ARMv9
x86
Intel
AMD
指定按键事件触发 (按下指定按键)
adb shell input keyevent <KEY_CODE>
其中<KEY_CODE>填以下内容
电话键
NAME INFO CODE
KEYCODE_CALL 拨号键 5
KEYCODE_ENDCALL 挂机键 6
KEYCODE_HOME 按键Home 3
KEYCODE_MENU 菜单键 82
KEYCODE_BACK 返回键 4
KEYCODE_SEARCH 搜索键 84
KEYCODE_CAMERA 拍照键 27
KEYCODE_FOCUS 拍照对焦键 80
KEYCODE_POWER 电源键 26
KEYCODE_NOTIFICATION 通知键 83
KEYCODE_MUTE 话筒静音键 91
KEYCODE_VOLUME_MUTE 扬声器静音键 164
KEYCODE_VOLUME_UP 音量增加键 24
KEYCODE_VOLUME_DOWN 音量减小键 25
控制键
NAME INFO CODE
KEYCODE_ENTER 回车键 66
KEYCODE_ESCAPE ESC键 111
KEYCODE_DPAD_CENTER 导航键 确定键 23
KEYCODE_DPAD_UP 导航键 向上 19
KEYCODE_DPAD_DOWN 导航键 向下 20
KEYCODE_DPAD_LEFT 导航键 向左 21
KEYCODE_DPAD_RIGHT 导航键 向右 22
KEYCODE_MOVE_HOME 光标移动到开始键 122
KEYCODE_MOVE_END 光标移动到末尾键 123
KEYCODE_PAGE_UP 向上翻页键 92
KEYCODE_PAGE_DOWN 向下翻页键 93
KEYCODE_DEL 退格键 67
KEYCODE_FORWARD_DEL 删除键 112
KEYCODE_INSERT 插入键 124
KEYCODE_TAB Tab键 61
KEYCODE_NUM_LOCK 小键盘锁 143
KEYCODE_CAPS_LOCK 大写锁定键 115
KEYCODE_BREAK Break/Pause键 121
KEYCODE_SCROLL_LOCK 滚动锁定键 116
KEYCODE_ZOOM_IN 放大键 168
KEYCODE_ZOOM_OUT 缩小键 169
组合键
NAME INFO CODE
KEYCODE_ALT_LEFT Alt+Left
KEYCODE_ALT_RIGHT Alt+Right
KEYCODE_CTRL_LEFT Control+Left
KEYCODE_CTRL_RIGHT Control+Right
KEYCODE_SHIFT_LEFT Shift+Left
KEYCODE_SHIFT_RIGHT Shift+Right
基本
NAME INFO CODE
KEYCODE_0 按键’0’ 7
KEYCODE_1 按键’1’ 8
KEYCODE_2 按键’2’ 9
KEYCODE_3 按键’3’ 10
KEYCODE_4 按键’4’ 11
KEYCODE_5 按键’5’ 12
KEYCODE_6 按键’6’ 13
KEYCODE_7 按键’7’ 14
KEYCODE_8 按键’8’ 15
KEYCODE_9 按键’9’ 16
KEYCODE_A 按键’A’ 29
KEYCODE_B 按键’B’ 30
KEYCODE_C 按键’C’ 31
KEYCODE_D 按键’D’ 32
KEYCODE_E 按键’E’ 33
KEYCODE_F 按键’F’ 34
KEYCODE_G 按键’G’ 35
KEYCODE_H 按键’H’ 36
KEYCODE_I 按键’I’ 37
KEYCODE_J 按键’J’ 38
KEYCODE_K 按键’K’ 39
KEYCODE_L 按键’L’ 40
KEYCODE_M 按键’M’ 41
KEYCODE_N 按键’N’ 42
KEYCODE_O 按键’O’ 43
KEYCODE_P 按键’P’ 44
KEYCODE_Q 按键’Q’ 45
KEYCODE_R 按键’R’ 46
KEYCODE_S 按键’S’ 47
KEYCODE_T 按键’T’ 48
KEYCODE_U 按键’U’ 49
KEYCODE_V 按键’V’ 50
KEYCODE_W 按键’W’ 51
KEYCODE_X 按键’X’ 52
KEYCODE_Y 按键’Y’ 53
KEYCODE_Z 按键’Z’ 54