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 | 键盘Enter | altleft ,altright | 键盘左右Alt |
backspace | 键盘Backspace | ctrlleft ,ctrlright | 键盘左右Ctrl |
delete | 键盘Del | shiftleft ,shiftright | 键盘左右shift |
esc | 键盘Esc | home,end | 键盘Home,End |
f1 ,f2 等 | 键盘F1 ,F2 等 | pageup,pagedown | 键盘PgUp,PgDn |
tab 或\t | 键盘Tab | up,down,left,right | 键盘上下左右 |
printscreen | 键盘PrtSc | winleft,winright | 左Win键以及右Win键 |
insert | 键盘Ins | command | Mac OS Command键 |
option | Mac 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设备,它的主要功能有:
- 运行设备的shell
- 管理模拟器或设备的端口映射
- 计算机和设备之间的上传/下载文件
- 可以对设备的应用进行卸载安装等。
简而言之,adb可以让用户在电脑上对手机进行操作。
华为手机开发者模式开启允许usb调试,HDB连接设备,外部来源应用下载。
电脑需要在设备安全性->内核隔离->关闭内存完整性,然后重启。
跟着华为的操作走,后面如下图所示连接成功。
命令 | 说明 |
---|---|
adb -p 5037 start-server | 杀死当前adb服务并重启在5037端口 |
adb kill-server | 关闭adb服务 |
adb devices | 查看当前连接的设备 |
adb get-serialno | 查看设备号 |
adb shell | 进入shell,可使用ls ,cd ,exit 等命令 |
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 forward | tcp: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-16 | 0-9 | KEYCODE_0-KEYCODE_9 |
19 | 向上 | KEYCODE_DPAD_UP |
20 | 向下 | KEYCODE_DPAD_DOWN |
21 | 向左 | KEYCODE_DPAD_LEFT |
22 | 向右 | KEYCODE_DPAD_RIGHT |
28 | 清除输入框内容(实测无效) | KEYCODE_CLEAR |
29-54 | A-Z | KEYCODE_A-KEYCODE_Z |
57 | Alt键 | KEYCODE_ALT_LEFT |
59 | 左shift,用于输入大小写 | KEYCODE_SHIFT_LEFT |
61 | Tab键 | KEYCODE_TAB |
62 | 空格键 | KEYCODE_SPACE |
66 | 回车键 | KEYCODE_ENTER |
67 | 删除键 | KEYCODE_DEL |
73 | 反斜杠\ | KEYCODE_BACKSLASH |
113 | ctrl 键 | KEYCODE_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
//列出所有可用的输入设备,以及每个设备的完整路径
adb shell getevent -p
//捕获和显示输入事件(名称)
adb shell getevent -l
//捕获和显示输入事件(编码)
adb shell getevent
//向指定的输入事件设备发送模拟的输入事件
adb shell sendevent 输入事件设备路径 事件类型 事件代码 事件值
事件类型
event types | 编码 | 说明 |
---|---|---|
EV_SYN | 0x00 | 同步事件 |
EV_KEY | 0x01 | 按键事件 |
EV_REL | 0x02 | 相对坐标 |
EV_ABS | 0x03 | 绝对坐标 |
EV_MSC | 0x04 | 其它 |
EV_SW | 0x05 | 开关事件 |
EV_LED | 0x11 | LED |
EV_SND | 0x12 | 声音 |
EV_REP | 0x14 | Repeat |
EV_FF | 0x15 | 力反馈 |
EV_PWR | 0x16 | |
EV_FF_STATUS | 0x17 | |
EV_MAX | 0x1f | |
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
构造注意事项如下,请严格遵照:
- getevent监听到的是16进制编码,但是我们sendevent发送的编码(TYPE CODE VALUE)均需要10进制编码
- 对目标设备需要有权限,且目标设备尽量有
777
权限- 注意
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晓波