前言
通过python控制windows的鼠标和键盘在屏幕上指定位置做点击操作和输入操作
一、导入相关模块
from ctypes import windll
import win32api
import win32con
import time # 控制鼠标间隔时间
二、实操
1、鼠标移动到指定位置
windll.user32.SetCursorPos(900, 300)
# 该代码执行后,鼠标会移动到(900, 300)的坐标点。
# SetCursorPos(x,y)函数:该函数把光标移到屏幕的指定位置,但是并没有点击。
- 控制鼠标到指定位置,但是这个时候我们又不知道具体坐标,那该怎么办了?不要着急,这个时候我们可以用QQ截图来获取坐标,下面为QQ截图获取坐标:
注意事项:在通过QQ截图获取屏幕定位时,屏幕缩放比必须为100%
2、模拟鼠标点击
Mouse_event
mouse_event函数功能: mouse_event函数功能是综合鼠标移动和按钮点击。如果鼠标被移动,用设置MOUSEEVENTF_MOVE来表明,dX和dy保留移动的信息。给出的信息是绝对或相对整数值。
VOID mouse_event(
DWORD dwFlags, // motion and click options
DWORD dx, // horizontal position or change
DWORD dy, // vertical position or change
DWORD dwData, // wheel movement
ULONG_PTR dwExtraInfo // application-defined information
);
参数介绍:
- dwFlags:标志位集,指定点击按钮和鼠标动作的多种情况。
- dx:指定鼠标沿x轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOUSEEVENTF_ABSOLUTE的设置。给出的绝对数据作为鼠标的实际X坐标;给出的相对数据作为移动的mickeys数。一个mickey表示鼠标移动的数量,表明鼠标已经移动。
- dy:指定鼠标沿y轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOUSEEVENTF_ABSOLUTE的设置。给出的绝对数据作为鼠标的实际y坐标,给出的相对数据作为移动的mickeys数。
- dwData:如果dwFlags为MOUSEEVENTF_WHEEL,则dwData指定鼠标轮移动的数量。正值表明鼠标轮向前转动,即远离用户的方向;负值表明鼠标轮向后转动,即朝向用户。一个轮击定义为WHEEL_DELTA,即120。如果dwFlagsS不是MOUSEEVENTF_WHEEL,则dWData应为零。
- dwExtralnfo:指定与鼠标事件相关的附加32位值。应用程序调用函数GetMessageExtraInfo来获得此附加信息。
- MOUSEEVENTF_LEFTDOWN:表明按下鼠标左键。
- MOUSEEVENTF_LEFTUP:表明松开鼠标左键。
- MOUSEEVENTF_RIGHTDOWN:表明按下鼠标右键。
- MOUSEEVENTF_RIGHTUP:表明松开鼠标右键。
- MOUSEEVENTF_MIDDLEDOWN:表明按下鼠标中键。
- MOUSEEVENTF_MIDDLEUP:表明松开鼠标中键。
- MOUSEEVENTF_WHEEL:在Windows NT中如果鼠标有一个轮,表明鼠标轮被移动。
- 点击操作当然要把按住和松开一起执行,并且为了保证是成功点击了,最好在中间添加一个短时间的休眠。
# mouse_event()函数:函数综合鼠标击键和鼠标动作
# 1.点击鼠标左键
# 移动鼠标到指定位置
windll.user32.SetCursorPos(1558, 645)
# 按下左键
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
# 短暂休眠
time.sleep(0.1)
# 松开左键
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
# 2.点击鼠标右键
# 移动鼠标到指定位置
windll.user32.SetCursorPos(1558, 645)
# 按下右键
win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)
# 短暂休眠
time.sleep(0.1)
# 松开右键
win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0)
# 3.鼠标点击中间键
# 移动鼠标到指定位置
windll.user32.SetCursorPos(564, 399)
# 按下中间键
win32api.mouse_event(win32con.MOUSEEVENTF_MIDDLEDOWN, 0, 0, 0, 0)
# 短暂休眠
time.sleep(0.1)
# 松开中间键
win32api.mouse_event(win32con.MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0)
# 4.模拟鼠标中轴滚动
# 移动鼠标到指定位置
windll.user32.SetCursorPos(2557, 362)
# 正数向上移动,负数向下移动。
win32api.mouse_event(win32con.MOUSEEVENTF_WHEEL, 0, 0, -50, 0)
3、模拟键盘输入
Keybd_event
keybd_event函数功能:该函数为Windows提供的虚拟键盘API函数,可合成一次击键事件。系统可使用该函数屏蔽相应键盘动作,合成的击键事件来产生WM_KEYUP或WM_KEYDOWN消息,触发一个按键事件。
keybd_event函数原型:
VOID keybd_event(
BYTE bVk, // virtual-key code
BYTE bScan, // hardware scan code
DWORD dwFlags, // flags specifying various function options
DWORD dwExtraInfo // additional data associated with keystroke
);
参数介绍:
- bVk:定义一个虚拟键码,键码值必须在1~254之间。(具体参见附录:常用模拟键的键值对照表);
- bScan:定义该键的硬件扫描码,一般不用设置,用0代替就行;
- dwFlags:定义函数操作的各个方面的一个标志位集,如果为keydown则置0即可,如果为keyup则设成”KEYEVENTF_KEYUP”;
- dwExtralnfo:定义与击键相关的附加的32位值,一般也置0即可。
'''模拟按下“Hi”'''
win32api.keybd_event(16, 0, 0, 0) # 按下Shift键
win32api.keybd_event(72, 0, 0, 0) # 按下h键
win32api.keybd_event(72, 0, win32con.KEYEVENTF_KEYUP, 0) # 松开h键
win32api.keybd_event(16, 0, win32con.KEYEVENTF_KEYUP, 0) # 松开Shift键,组合键——按下Shift的同时按下h,形成H
win32api.keybd_event(73, 0, 0, 0)
win32api.keybd_event(73, 0, win32con.KEYEVENTF_KEYUP, 0) # 松开i键
常用模拟键的键值对照表:
键盘键与虚拟键码对照表
字母和数字键 数字小键盘的键 功能键 其它键
键 键码 键 键码 键 键码 键 键码
A 65 0 96 F1 112 Backspace 8
B 66 1 97 F2 113 Tab 9
C 67 2 98 F3 114 Clear 12
D 68 3 99 F4 115 Enter 13
E 69 4 100 F5 116 Shift 16
F 70 5 101 F6 117 Control 17
G 71 6 102 F7 118 Alt 18
H 72 7 103 F8 119 Caps Lock 20
I 73 8 104 F9 120 Esc 27
J 74 9 105 F10 121 Spacebar 32
K 75 * 106 F11 122 Page Up 33
L 76 + 107 F12 123 Page Down 34
M 77 Enter 108 -- -- End 35
N 78 - 109 -- -- Home 36
O 79 . 110 -- -- Left Arrow 37
P 80 / 111 -- -- Up Arrow 38
Q 81 -- -- -- -- Right Arrow 39
R 82 -- -- -- -- Down Arrow 40
S 83 -- -- -- -- Insert 45
T 84 -- -- -- -- Delete 46
U 85 -- -- -- -- Help 47
V 86 -- -- -- -- Num Lock 144
W 87
X 88
Y 89
Z 90
0 48
1 49
2 50
3 51
4 52
5 53
6 54
7 55
8 56
9 57