python控制鼠标,键盘,adb

python控制鼠标,键盘,adb

听说某系因为奖学金互相举报,好像拿不到要命一样。不禁想到几天前老墨偷走丁胖子的狗,被丁胖子逮到。他面对警察的问询面不改色坚持自我,反而是怒气冲冲的丁胖子被警察认为是偷狗贼。我觉得这就是一种自信:凡事以自我为中心,当感性战胜理性,自己就是真理。
同学之间相识即是一场缘分,相互珍惜吧。

1. pyautogui

运行时可能失去对鼠标键盘的控制。

解决:

windows:ctrl+alt+del

mac os:command+shift+option+q

1. 键盘相关

输出字符

import pyautogui
import time
time.sleep(8) # 有8秒的时间设置光标焦点
pyautogui.write('Hello, World!', interval=0.1)  # 每个字符之间间隔0.1秒打印
pyautogui.write(['a','p','p','p','backspace','l','l','left','delete','e'], interval=0.1)

在这里插入图片描述

特殊python输入

enter\n键盘Enteraltleftaltright键盘左右Alt
backspace键盘Backspacectrlleftctrlright键盘左右Ctrl
delete键盘Delshiftleftshiftright键盘左右shift
esc键盘Eschome,end键盘Home,End
f1f2键盘F1F2pageup,pagedown键盘PgUp,PgDn
tab\t键盘Tabup,down,left,right键盘上下左右
printscreen键盘PrtScwinleft,winright左Win键以及右Win键
insert键盘InscommandMac OS Command键
optionMac OS option键
import pyautogui
import time
time.sleep(5) # 有5秒的时间设置光标焦点
#相当于组合键a+8,打印a8
pyautogui.keyDown('a')#按下按键不松开
pyautogui.press('8')#按下按键不松开
pyautogui.keyUp('a') #放开所按按键
#相当于组合键ctrl+f,开搜索框
pyautogui.hotkey('ctrl','f') #组合键打开搜索框
# 自动到下一个输入框
import pyautogui
import time
time.sleep(6) # 有6秒的时间设置光标焦点
pyautogui.typewrite('lihua\t')
pyautogui.typewrite('123456\t')

在这里插入图片描述

2. 鼠标相关

获取位置以及移动鼠标

import pyautogui
import time
time.sleep(2) #2秒程序开始
#目前计算机屏幕像素
Swidth,Sheight=pyautogui.size()
print(Swidth,Sheight)
# 获取鼠标光标位置
xloc,yloc=pyautogui.position()
print(xloc,yloc)
# 绝对位置移动光标
time.sleep(1)
pyautogui.moveTo(1500,600,duration=2)# 两秒时间移动鼠标移动到此
time.sleep(1)
pyautogui.moveRel(0,300,duration=1)#一秒时间鼠标光标相对于之前位置向下移动300

DOS界面在固定位置输出

import pyautogui
import time
time.sleep(2) #2秒程序开始
print('ctrl+c可结束本程序')
try:
    while True:
        xloc,yloc=pyautogui.position()
        str1='x= '+str(xloc).rjust(4)+', y= '+str(yloc).rjust(4) #右对齐
        print(str1,end='\r',flush=True)
        #\r光标回到行首,flush=True立即将输出刷新到窗口,避免输出缓冲导致的消息延迟问题
        time.sleep(1)
except KeyboardInterrupt:
    print('Bye!')

在这里插入图片描述

按住与放开鼠标

import pyautogui
import time
time.sleep(5) #2秒程序开始
pyautogui.mouseDown(button='right') # 在鼠标光标位置按住鼠标右键
time.sleep(1)
pyautogui.mouseUp(800,300,button='right') # 放开后鼠标光标在(800,300)

拖动鼠标画图

import pyautogui
import time

time.sleep(3)      # 这10秒需要绘图窗口取得焦点,选择画笔和选择颜色
pyautogui.click()   # 单击设定绘图起始点
displacement = 10
while displacement < 300:
    pyautogui.dragRel(displacement, 0, duration=0.2) #相对于原位置向右拖动,用时0.2秒
    pyautogui.dragRel(0, displacement, duration=0.2) #相对于原位置向下拖动
    pyautogui.dragRel(-displacement, 0, duration=0.2) #相对于原位置向左拖动
    pyautogui.dragRel(0, -displacement, duration=0.2) #相对于原位置向上拖动
    displacement += 10

在这里插入图片描述

窗口滚动

scroll(clicks=,x=,y=)

clicks是窗口滚动的单位数,x,y是鼠标光标移动位置,可以省略。

import pyautogui
import time

time.sleep(5)
pyautogui.scroll(30)    # 往上卷动      
time.sleep(3)
pyautogui.scroll(-30)   # 往下卷动
time.sleep(3)
pyautogui.scroll(-60,x=500,y=800) #先将鼠标光标移动到(500,800)处然后才开始滚动,实测肉眼所见鼠标位置并未发生变化

3. 屏幕截取

import pyautogui
#方法一
screenImage = pyautogui.screenshot("out_1.jpg")
#方法二
screenImage.save("out_2.jpg")
# 截取一部分
screenImage = pyautogui.screenshot()
cropPict = screenImage.crop((960,210,1900,480))
#The box is a 4-tuple defining the left, upper, right, and lower pixel coordinate
cropPict.save("out_3.jpg")

out_1.jpg和out_2.jpg

在这里插入图片描述

out_3.jpg

在这里插入图片描述

2. pynput

1. 鼠标

鼠标位置

from pynput import mouse, keyboard
from pynput.mouse import Button, Controller
import time
#鼠标控制器
m1=Controller()
print(m1.position)# 获取当前鼠标位置
m1.position=(300,500) #设置鼠标绝对位置
m1.move(100,100) #鼠标相对当前位置移动
time.sleep(1)
print(m1.position)# (400, 600)

鼠标点击释放

from pynput import mouse, keyboard
from pynput.mouse import Button, Controller
import time
# 鼠标控制器
m1 = Controller()
for i in range(10):
    print(666)
time.sleep(3)
m1.click(Button.right, 1)#右键1次
# 按下和释放右键
m1.press(Button.right)
m1.release(Button.right)
# 双击左键
m1.click(Button.left, 2)
# 滚动鼠标滚轮
time.sleep(1.5)
m1.scroll(0, 20)#向上滑动
time.sleep(1.5)
m1.scroll(0, -20)# 向下滑动
#右键可能会影响滑动

鼠标监听相关

from pynput import mouse
import time
# 移动监听
def on_move(x, y):
    print('鼠标移动到了:{}'.format((x, y)))
# 点击监听
def on_click(x, y, button, pressed):
    print('鼠标按键:{},在位置处 {}, {} '.format(button, (x, y), '按下了' if pressed else '释放了'))
# 滚动监听
def on_scroll(x, y, dx, dy):
    print('滚动中... {} 至 {}'.format('向下:' if dy < 0 else '向上:', (x, y)))

# 构造监听器对象,方式2(可替换上面with)(监听哪几种类型事件)
listener = mouse.Listener(
    on_move=on_move,
    on_click=on_click,
    on_scroll=on_scroll)

# 开始监听
listener.start()
while listener.is_alive():
    time.sleep(1)
# 关闭监听器和用户输入线程
listener.stop()
print("程序结束")

可以试试pyinterception

2. 键盘

键盘

from pynput.keyboard import Key, Controller
import time
# 键盘控制器
keyboard = Controller()

# 按下和释放键盘,Key.space表示空格键
keyboard.press(Key.space)
keyboard.release(Key.space)

# 输入,例如输入Hello World
time.sleep(1)
keyboard.type('Hello World')

键盘监听相关

import time
from pynput.keyboard import Key, Listener
from pynput.mouse import Button, Controller
x = 0
y = 0
m1=Controller()
def on_press(key):
    global x, y, user_input
    if hasattr(key, 'char'):
        if key.char == 'j':  # 按j检测位置
            x, y = m1.position
            print(f"x:{x} y:{y}")
        elif key.char == 't':  # 按t终止程序
            listener.stop()
        else:
            print(f"{key} 被按下")
    else:
        print('特殊键: {} 被按下'.format(key))
# 创建监听器对象并开始监听按键
listener = Listener(on_press=on_press)
listener.start()
# 等待用户输入t使监听器停止
while listener.is_alive():
    time.sleep(1)
# 关闭监听器和用户输入线程
listener.stop()
print("程序结束")

3. adb相关

1. adb概念

adb:Android Debug Bridge,起到调试桥作用。

ADB可以直接操作管理手机模拟器或者真实的Android设备,它的主要功能有:

  1. 运行设备的shell
  2. 管理模拟器或设备的端口映射
  3. 计算机和设备之间的上传/下载文件
  4. 可以对设备的应用进行卸载安装等。

简而言之,adb可以让用户在电脑上对手机进行操作。

华为手机开发者模式开启允许usb调试,HDB连接设备,外部来源应用下载。

电脑需要在设备安全性->内核隔离->关闭内存完整性,然后重启。

跟着华为的操作走,后面如下图所示连接成功。

在这里插入图片描述

命令说明
adb -p 5037 start-server杀死当前adb服务并重启在5037端口
adb kill-server关闭adb服务
adb devices查看当前连接的设备
adb get-serialno查看设备号
adb shell进入shell,可使用lscdexit等命令
adb root获得root权限(安卓9以上不行)
adb remount获取system文件的读写权限
adb -s 设备号 shell当同时连接了多台设备,指定一个设备号进行连接
adb shell pm list packages列出手机所装的所有app的包名。
-f额外显示安装路径。
-e显示当前启用的包名
-d显示当前禁用的包名
-s显示系统应用包名
-3显示已安装的第三方包名
xxx需要过滤的包名
adb shell rm *.apk删除系统应用
adb install d:\xxx.apk通过命令安装安卓应用。
-r覆盖安装
-g安装时把所有权限打开
允许降级覆盖安装
adb uninstall apk 包名通过命令卸载安卓应用。
-k卸载时保留该应用的数据和缓存
adb shell am force-stop 包名强制退出该应用
adb push 本地路径 远程手机路径上传文件
adb pull 远程路径 本地路径下载文件
adb logcat查看日志
adb forwardtcp:8888 tcp:8080 设备端口8080转发到主机端口8888
–remove tcp:8888 取消主机8888转发
–list 列出当前端口转发列表

获取一些信息

adb shell getprop ro.product.model获取设备型号
adb shell getprop ro.build.version.release获取Android系统版本
adb shell dumpsys activity |find 包名查看前台应用包名,必须先启动app,适用于Android 8.0以上
adb shell cat /proc/meminfo获取手机内存信息
adb shell df获取手机存储信息

截屏相关

adb shell wm size查看屏幕分辨率
adb shell screencap -p /sdcard/mms.png屏幕截图
adb shell screencap -p /sdcard/screenshot.png屏幕截图
adb shell screenrecord 存放路径/xxx.mp4录屏,命名以.mp4结尾
adb shell screenrecord --time-limit 10 存放路径/xxx.mp4录屏时间为10秒

在这里插入图片描述

2. adb shell input指令

为了防止手机坏掉,以雷电模拟器做演示。

在这里插入图片描述

1. text
adb shell input text "hello,\ world"
	//1. 使用前提是当前输入位置已经获得了焦点
    //2. 特殊字符(如\,空格,&等),如果反斜杠转义无效,则需要用keyevent输入
    //3. 输入中进行左移和右移都得用keyevent。
2. keyevent
adb shell input keyevent 67 
adb shell input keyevent KEYCODE_BACKSLASH
按键键码功能对应的安卓定义keyevent
1按menu键KEYCODE_MENU
3按home键KEYCODE_HOME
4按back键KEYCODE_BACK
7-160-9KEYCODE_0-KEYCODE_9
19向上KEYCODE_DPAD_UP
20向下KEYCODE_DPAD_DOWN
21向左KEYCODE_DPAD_LEFT
22向右KEYCODE_DPAD_RIGHT
28清除输入框内容(实测无效)KEYCODE_CLEAR
29-54A-ZKEYCODE_A-KEYCODE_Z
57Alt键KEYCODE_ALT_LEFT
59左shift,用于输入大小写KEYCODE_SHIFT_LEFT
61Tab键KEYCODE_TAB
62空格键KEYCODE_SPACE
66回车键KEYCODE_ENTER
67删除键KEYCODE_DEL
73‌反斜杠\KEYCODE_BACKSLASH
113ctrlKEYCODE_CTRL_LEFT
3. tap 点击

模拟手指点击屏幕

雷电模拟器开启指针位置,并在LDPlayer9\vms目录下新建debug.txt,重启模拟器。

在这里插入图片描述

在这里插入图片描述

当你按住屏幕的时候就能看到坐标

在这里插入图片描述

adb shell input tap 96 70
4. swipe 划屏或长按

从起点划到终点,或者长按功能

swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)

//向上划动
adb shell input swipe 300 500 300 200 1000

在这里插入图片描述

5. draganddrop 拖动

draganddrop <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)

swipe的区别是draganddrop在taptap上滑屏会失败

adb shell input draganddrop 300 500 300 200 1000

在这里插入图片描述

3. 事件相关

​ 在Android系统中,输入事件(如触摸、按键等)通常由设备上的硬件传感器或用户交互产生,并通过/dev/input/目录下的event设备文件传输到系统。

注意与keyevent区分!

1. 一些概念

感兴趣可以读一下源码/include/uapi/linux/input-event-codes.h

event type的详细定义

//列出所有可用的输入设备,以及每个设备的完整路径
adb shell getevent -p
//捕获和显示输入事件(名称)
adb shell getevent -l
//捕获和显示输入事件(编码)
adb shell getevent 
//向指定的输入事件设备发送模拟的输入事件
adb shell sendevent 输入事件设备路径 事件类型 事件代码 事件值

在这里插入图片描述

事件类型

event types编码说明
EV_SYN0x00同步事件
EV_KEY0x01按键事件
EV_REL0x02相对坐标
EV_ABS0x03绝对坐标
EV_MSC0x04其它
EV_SW0x05开关事件
EV_LED0x11LED
EV_SND0x12声音
EV_REP0x14Repeat
EV_FF0x15力反馈
EV_PWR0x16
EV_FF_STATUS0x17
EV_MAX0x1f
EV_CNT(EV_MAX+1)

EV_SYN类型的事件代码

#define SYN_REPORT      0
#define SYN_CONFIG      1
#define SYN_MT_REPORT   2

EV_KEY类型的事件代码
或称常用键位的扫描码

/*
 * Keys and buttons
 *
 * Most of the keys/buttons are modeled after USB HUT 1.12
 * (see http://www.usb.org/developers/hidpage).
 * Abbreviations in the comments:
 * AC - Application Control
 * AL - Application Launch Button
 * SC - System Control
 */

#define KEY_RESERVED		0	// 0x00
#define KEY_ESC			1	// 0x01
#define KEY_1			2	// 0x02
#define KEY_2			3	// 0x03
#define KEY_3			4	// 0x04
#define KEY_4			5	// 0x05
#define KEY_5			6	// 0x06
#define KEY_6			7	// 0x07
#define KEY_7			8	// 0x08
#define KEY_8			9	// 0x09
#define KEY_9			10	// 0x0A
#define KEY_0			11	// 0x0B
#define KEY_MINUS		12	// 0x0C
#define KEY_EQUAL		13	// 0x0D
#define KEY_BACKSPACE		14	// 0x0E
#define KEY_TAB            15	// 0x0F
#define KEY_Q               16	// 0x10
#define KEY_W               17	// 0x11
#define KEY_E               18	// 0x12
#define KEY_R               19	// 0x13
#define KEY_T               20	// 0x14
#define KEY_Y               21	// 0x15
#define KEY_U               22	// 0x16
#define KEY_I               23	// 0x17
#define KEY_O               24	// 0x18
#define KEY_P               25	// 0x19
#define KEY_LEFTBRACE       26	// 0x1A
#define KEY_RIGHTBRACE      27	// 0x1B
#define KEY_ENTER           28	// 0x1C
#define KEY_LEFTCTRL        29	// 0x1D
#define KEY_A               30	// 0x1E
#define KEY_S               31	// 0x1F
#define KEY_D               32	// 0x20
#define KEY_F               33	// 0x21
#define KEY_G               34	// 0x22
#define KEY_H               35	// 0x23
#define KEY_J               36	// 0x24
#define KEY_K               37	// 0x25
#define KEY_L               38	// 0x26
#define KEY_SEMICOLON       39	// 0x27
#define KEY_APOSTROPHE      40	// 0x28
#define KEY_GRAVE           41	// 0x29
#define KEY_LEFTSHIFT       42	// 0x2A
#define KEY_BACKSLASH       43	// 0x2B
#define KEY_Z               44	// 0x2C
#define KEY_X			45	// 0x2D
#define KEY_C			46	// 0x2E
#define KEY_V			47	// 0x2F
#define KEY_B			48	// 0x30
#define KEY_N			49	// 0x31
#define KEY_M			50	// 0x32
#define KEY_COMMA		51	// 0x33
#define KEY_DOT			52	// 0x34
#define KEY_SLASH		53	// 0x35
#define KEY_RIGHTSHIFT		54	// 0x36
#define KEY_KPASTERISK		55	// 0x37
#define KEY_LEFTALT		56	// 0x38
#define KEY_SPACE		57	// 0x39
#define KEY_CAPSLOCK		58	// 0x3A
...
#define BTN_TOUCH		330 // 0x14a

EV_REL类型的事件代码

#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类型的事件代码

#define ABS_MT_SLOT     0x2f    /* MT slot being modified */ //MT(Multi-Touch)槽位用于标识当前正在处理的触控点。
#define ABS_MT_TOUCH_MAJOR  0x30    /* Major axis of touching ellipse */ //触摸椭圆的长轴
#define ABS_MT_TOUCH_MINOR  0x31    /* Minor axis (omit if circular) */  //触摸椭圆的短轴
#define ABS_MT_WIDTH_MAJOR  0x32    /* Major axis of approaching ellipse */ //工具本身的横截面积或工具本身较长方向的长度
#define ABS_MT_WIDTH_MINOR  0x33    /* Minor axis (omit if circular) */ //工具本身较短尺寸的长度
#define ABS_MT_ORIENTATION  0x34    /* Ellipse orientation */ //椭圆的方向
#define ABS_MT_POSITION_X   0x35    /* Center X ellipse position */ //椭圆中心X位置
#define ABS_MT_POSITION_Y   0x36    /* Center Y ellipse position */ //椭圆中心Y位置
#define ABS_MT_TOOL_TYPE    0x37    /* Type of touching device */ //触摸设备的类型
#define ABS_MT_BLOB_ID      0x38    /* Group a set of packets as a blob */ //数据包分组ID
#define ABS_MT_TRACKING_ID  0x39    /* Unique ID of initiated contact */ //接触的唯一ID
#define ABS_MT_PRESSURE     0x3a    /* Pressure on contact area */ //接触面上的压力
#define ABS_MT_DISTANCE     0x3b    /* Contact hover distance */ //接触悬停距离
2. 权限问题

由于权限问题,其他用户没法sendevent

在这里插入图片描述

模拟器打开magisk软件(真机应该不行吧),把下面这个打勾

在这里插入图片描述

重进一下adb shell

su
chmod 777 /dev/input/event2
ls -l /dev/input/event2

在这里插入图片描述

3. 全选删除事件

一个cmd终端开始监听事件(名称)

adb shell getevent -l 

然后输点东西,ctrl+A,删除文本,可监听并截取到如下事件

/dev/input/event2: EV_ABS       ABS_MT_TRACKING_ID   0000000d //有一个触控点开始被跟踪
/dev/input/event2: EV_KEY       BTN_TOUCH            DOWN
/dev/input/event2: EV_ABS       ABS_MT_POSITION_X    00000155 //触控点X坐标位置
/dev/input/event2: EV_ABS       ABS_MT_POSITION_Y    0000029d //触控点的Y坐标位置
/dev/input/event2: EV_SYN       SYN_REPORT           00000000 //同步事件
/dev/input/event2: EV_ABS       ABS_MT_POSITION_Y    0000029e
/dev/input/event2: EV_SYN       SYN_REPORT           00000000 //同步事件
/dev/input/event2: EV_ABS       ABS_MT_TRACKING_ID   ffffffff //ID设为一个无效值,在多点触控协议中,这意味着该触控点不再被跟踪,即触摸结束
/dev/input/event2: EV_KEY       BTN_TOUCH            UP 	  //触摸动作的结束
/dev/input/event2: EV_SYN       SYN_REPORT           00000000 //同步事件
/dev/input/event2: EV_KEY       KEY_LEFTCTRL         DOWN	  //左Ctrl键被按下
/dev/input/event2: EV_SYN       SYN_REPORT           00000000 //同步事件
/dev/input/event2: EV_KEY       KEY_A                DOWN	  //A被按下
/dev/input/event2: EV_SYN       SYN_REPORT           00000000 //同步事件
/dev/input/event2: EV_KEY       KEY_A                UP 	  //A松开
/dev/input/event2: EV_SYN       SYN_REPORT           00000000 //同步事件
/dev/input/event2: EV_KEY       KEY_LEFTCTRL         UP 	  //左ctrl抬起
/dev/input/event2: EV_SYN       SYN_REPORT           00000000
/dev/input/event2: EV_KEY       KEY_BACKSPACE        DOWN     //删除键按下
/dev/input/event2: EV_SYN       SYN_REPORT           00000000 
/dev/input/event2: EV_KEY       KEY_BACKSPACE        UP		  //删除键抬起
/dev/input/event2: EV_SYN       SYN_REPORT           00000000 

构造注意事项如下,请严格遵照:

  1. getevent监听到的是16进制编码,但是我们sendevent发送的编码(TYPE CODE VALUE)均需要10进制编码
  2. 对目标设备需要有权限,且目标设备尽量有777权限
  3. 注意time.sleep的适当停顿,不然模拟器可能反应不过来
"EV_ABS ABS_MT_TRACKING_ID 0000000d", 
"EV_KEY BTN_TOUCH DOWN",
"EV_ABS ABS_MT_POSITION_X 00000155",
"EV_ABS ABS_MT_POSITION_Y 0000029d",
"EV_SYN SYN_REPORT 00000000",
"EV_ABS ABS_MT_TRACKING_ID ffffffff",
"EV_KEY BTN_TOUCH UP",
"EV_SYN SYN_REPORT 00000000",
"EV_KEY KEY_LEFTCTRL DOWN",
"EV_SYN SYN_REPORT 00000000",
"EV_KEY KEY_A DOWN",
"EV_SYN SYN_REPORT 00000000",
"EV_KEY KEY_A UP",
"EV_SYN SYN_REPORT 00000000",
"EV_KEY KEY_LEFTCTRL UP",
"EV_SYN SYN_REPORT 00000000",
"EV_KEY KEY_BACKSPACE DOWN",
"EV_SYN SYN_REPORT 00000000",
"EV_KEY KEY_BACKSPACE UP",
"EV_SYN SYN_REPORT 00000000"

名称替换成10进制编码,并构造成python脚本

import os
import time
l=[
    "0003 0057 00000013", #d
    "0001 0330 00000001",
    "0003 0053 00000341", #155
    "0003 0054 00000669", #29d
    "0000 0000 00000000",
    "0003 0057 4294967295", #ffffffff
    "0001 0330 00000000",
    "0000 0000 00000000",
    "0001 0029 00000001",
    "0000 0000 00000000",
    "0001 0030 00000001",
    "0000 0000 00000000",
    "0001 0030 00000000",
    "0000 0000 00000000",
    "0001 0029 00000000",
    "0000 0000 00000000",
    "0001 0014 00000001",
    "0000 0000 00000000",
    "0001 0014 00000000",
    "0000 0000 00000000"
]

for i in l:
    time.sleep(0.5)#合理的延迟
    #getevent接收到的是16进制,我们发送的时候要发送10进制
    print("adb shell sendevent /dev/input/event2 "+i)
    os.system("adb shell sendevent /dev/input/event2 "+i)

整点数据

asdfsdfjkl;asdfjkl;'asdfghjkl;asdfghjkl;'zxcvbnmasdfghjkl;zxcvbnmasdfghjkl;'qwertyuiop[asdfghjkl;zxcvbnm,./qwertyuiopasdfghjkl;zxcvbnm0987654321!@#$%^&*()_+qwertyuiopasdfghjkl;zxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890-=[]\;|:'\",.<>?/;~`_++--**((()))))asdfsdfjkl;asdfjkl;'asdfghjkl;asdfghjkl;'zxcvbnmasdfghjkl;zxcvbnmasdfghjkl;'qwertyuiop[asdfghjkl;zxcvbnm,./qwertyuiopasdfghjkl;zxcvbnm0987654321!@#$%^&*()_+qwertyuiopasdfghjkl;zxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890-=[]\;|:'\",.<>?/;~`_++--**asdfsdfjkl;asdfjkl;'asdfghjkl;asdfghjkl;'zxcvbnmasdfghjkl;zxcvbnmasdfghjkl;'qwertyuiop[asdfghjkl;zxcvbnm,./qwertyuiopasdfghjkl;zxcvbnm0987654321!@#$%^&*()_+qwertyuiopasdfghjkl;zxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890-=[]\;|:'\",.<>?/;~`_++--**((()))))asdfsdfjkl;asdfjkl;'asdfghjkl;asdfghjkl;'zxcvbnmasdfghjkl;zxcvbnmasdfghjkl;'qwertyuiop[asdfghjkl;zxcvbnm,./qwertyuiopasdfghjkl;zxcvbnm0987654321!@#$%^&*()_+qwertyuiopasdfghjkl;zxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890-=[]\;|:'\",.<>?/;~`_++--**

在这里插入图片描述

运行脚本,如下图,删干净了。

在这里插入图片描述

参考

我心中的王者:Python-用Python控制鼠标、屏幕与键盘 andyyah晓波

ADB安装及使用详解 程序员-老K

Android adb keyevent 键值大全 Godery

安卓开发文档

pynput详细教程 rmticocean

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cllsse

富✌您吉祥

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值