一、windows API
1、官方文档
2、pywin32
3、win32api
4、win32gui
5、win32clipboard
二、windows API的另一种键鼠输入
1、PyUserInput
2、支持的平台及依赖
3、方法
在官方文档中,可以查找到操作windows窗口的所有说明,无非是用C语言进行的解释,C语言的函数。但是理解起来并不是很困难,通过关键字去寻找对应的函数,每个函数中对应的参数的含义基本都能行得通,可以在其他语言中进行转换理解调用即可。如果你不理解英文,可以右键翻译中文,怎么方便怎么来。
官方文档地址---Technical documentation | Microsoft Docs
pywin32是Windows API的一种,主要包含windows常量、接口、线程以及COM机制等,自带IDE。是python中自动操作windows的重要驱动,所以在python自动化操作桌面前必须先安装pywin32。如果要有事件判断等操作,还需要安装pyHook。
安装命令:pip install pywin32、pip install pyHook
. (1)ShellExecute(HWND, Operation, FileName, Parameters, Directory, ShowCmd)
打开软件或文件
HWND # 指定父窗口句柄
Operation # 指定动作,如edit、explore、open、find、print、NULL
FileName # 指定要打开的文件或程序
Parameters # 指定打开程序所需参数
Directory # 缺省目录
ShowCmd # 打开选项,可选值:
SW_HIDE=0 # 隐藏窗口,活动状态给另一个窗口
SW_SHOWNORMAL=1/SW_RESTORE=9/SW_SHOWDEFAULT=10/SW_MAX=10 # 用最近的大小和位置显示窗口,同时令其进入活动状态
SW_SHOWNOACTIVATE=4 # 用最近的大小和位置显示一个窗口,不改变活动窗口
SW_SHOW=5 # 用当前的大小和位置显示一个窗口,令其进入活动状态
SW_NORMAL=1/SW_SHOWNA=8 # 用当前的大小和位置显示一个窗口,不改变活动窗口
SW_MINIMIZE=6/SW_SHOWMINNOACTIVE=7 # 最小化窗口,不激活
SW_SHOWMINIMIZED=2 # 最小化窗口,并将其激活
SW_SHOWMAXIMIZED=3/SW_MAXIMIZE=3 # 最大化窗口,并将其激活
执行成功会返回应用程序句柄,如果返回值 <= 32,则表示执行错误:
0---内存不足
2---文件名错误
3---路径名错误
11---EXE文件无效
26---发生共享错误
27---文件名不完全或无效
28---超时
29---DDE事务失败
30---正在处理其他DDE事务而不能完成该DDE事务
31---没有相关联的应用程序
(2)keybd_event(bVk, bScan, dwFlags, dwExtraInfo)
模拟键盘输入
bVk # 虚拟键码(键盘键码对照表)
bScan # 硬件扫描码(一般为0)
dwFlags # 函数操作的一个标志位(KEYEVENTF_EXTENDEDKEY/0:按键,KEYEVENTF_KEYUP:松键)
dwExtraInfo # 定义与击键相关的附加的32位值(一般为0)
(3)GetCursorPos()
模拟鼠标输入-获取鼠标当前位置的坐标
(4)SetCursorPos((x, y))
模拟鼠标输入-将鼠标移动到坐标处
(5)mouse_event(dwFlags, x, y, data, extra_info)
模拟鼠标输入
dwFlags # 函数操作的一个标志位
MOUSEEVENTF_ABSOLUTE/0x8000 # dx和 dy参数包含规范化的绝对坐标。如果未设置,这些参数将包含相对数据:自上次报告的位置以来的位置变化。无论连接到系统的鼠标或类似鼠标的设备(如果有)如何,都可以设置或不设置此标志
MOUSEEVENTF_LEFTDOWN/0x0002 # 左键按下
MOUSEEVENTF_LEFTUP/0x0004 # 左键松开
MOUSEEVENTF_MIDDLEDOWN/0x0020 # 中间按钮按下
MOUSEEVENTF_MIDDLEUP/0x0040 # 中间按钮松开
MOUSEEVENTF_MOVE/0x0001 # 鼠标移动
MOUSEEVENTF_RIGHTDOWN/0x0008 # 右键按下
MOUSEEVENTF_RIGHTUP/0x0010 # 右键松开
MOUSEEVENTF_WHEEL/0x0800 # 如果鼠标有滚轮,则滚轮已移动。移动量在dwData中指定
MOUSEEVENTF_XDOWN/0x0080 # 已按下X按钮
MOUSEEVENTF_XUP/0x0100 # 释放了X按钮
MOUSEEVENTF_WHEEL/0x0800 # 滚轮按钮旋转
MOUSEEVENTF_HWHEEL/0x01000 # 滚轮按钮倾斜
指定鼠标按钮状态的值设置为指示状态更改,而不是正在进行的条件。例如,如果按下并按住鼠标左键, 则在首次按下左键时设置MOUSEEVENTF_LEFTDOWN,但不用于后续动作。同样,仅当首次释放按钮时,才会设置MOUSEEVENTF_LEFTUP。
不能在dwFlags参数中同时指定MOUSEEVENTF_WHEEL和MOUSEEVENTF_XDOWN或MOUSEEVENTF_XUP,因为它们都需要使用dwData字段。
dx # 现在鼠标要进行操作位置的横坐标x(我理解的)
鼠标沿x轴的绝对位置或其自上次生成鼠标事件以来的运动量,具体取决于MOUSEEVENTF_ABSOLUTE设置。绝对数据被指定为鼠标的实际x坐标;相对数据指定为移动的米奇数量。米奇是鼠标必须移动的量,以报告它已经移动。
dx # 现在鼠标要进行操作位置的纵坐标y(我理解的)
鼠标沿y轴的绝对位置或其自上次生成鼠标事件以来的运动量,具体取决于MOUSEEVENTF_ABSOLUTE设置。绝对数据被指定为鼠标的实际y坐标;相对数据指定为移动的米奇数量。
dwData # 一般定义的滚轮一次三行,即增量设置为120,正值表示向下滚动(向前,即你面向的方向)、负值表示向上滚动(向后,即朝着你的方向)
如果dw标志包含MOUSEEVENTF_WHEEL,则dwData指定车轮移动量。正值表示滚轮向前旋转,远离用户; 负值表示滚轮向后旋转,朝向用户。一次车轮点击被定义为WHEEL_DELTA,即120。
如果dw标志包含MOUSEEVENTF_HWHEEL,则dwData指定车轮移动量。正值表示车轮向右倾斜;负值表示滚轮向左倾斜。
如果dw标志包含MOUSEEVENTF_XDOWN或MOUSEEVENTF_XUP,则dwData指定按下或释放了哪些X按钮。此值可以是以下标志的任意组合。
如果dw标志未MOUSEEVENTF_WHEEL、MOUSEEVENTF_XDOWN或MOUSEEVENTF_XUP,则dwData应为零。
dwExtraInfo # 与鼠标事件关联的附加值
(1)FindWindow(lpClassName = None, lpWindowName = None)
查找窗体的句柄
lpClassName = None # 字符型,窗体的类名,可以在Spy++里找到
lpWindowName = None # 字符型,窗口名,也就是标题栏上能看见的那个标题
(2)FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None)
查找子窗口的句柄
hwndParent=0 # 父窗口句柄
hwndChildAfter=0 # 从第一个子窗体开始搜索;若不为0,则按照z-index的顺序从hwndChildAfter向后开始搜索子窗体
lpszClass=None # 子窗口类名
lpszWindow=None # 子窗口标题
(3)EnumWindows(lambda hwnd, param: param.append(hwnd), hwnd_list)
枚举所有窗口句柄
hwnd_list = [] # 先初始化一个空列表
hwnd_list.append(hwnd) # 将获取到的所有句柄添加到句柄空列表中
(4)EnumChildWindows(win_handle, lambda hwnd, param: param.append(hwnd), hwndChildList)
枚举某父窗口的子窗口句柄
hwndChildList= [] # 先初始化一个空列表
hwndChildList.append(win_handle.hwnd) # 将获取到的所有子窗口句柄添加到句柄空列表中
(5)GetClassName(handle)
获取句柄的类名
handle #父窗口句柄
(6)GetWindowText(handle)
获取句柄的标题
handle #父窗口句柄
(7)GetWindowRect(handle)
获取句柄的矩形四坐标(left-x,top-y,right-x,bottom-y)
handle # 父窗口句柄
(8)GetMenu(subHandle)
获取句柄的菜单句柄
subhandle # 子窗口句柄
(9)GetSubMenu(menuHandle, 子菜单索引号)
获取子菜单或下拉菜单句柄
menuHandle # 主菜单句柄
子菜单索引号
(10)GetMenuItemID(subMenuHandle, 项目索引号)
获取菜单项中的的标志符
注意:分隔符是被编入索引的
handle # 窗口句柄
项目索引号
(11)postMessage(hwnd, win32con.WM_COMMAND, WParam, IParam)
发送消息
hwnd # 句柄
win32con.WM_COMMAND # 消息类型
WParam # 32位整型,high word就是他的31至16位,low word是它的15至0位
IParam # 当参数超过两个,wParam和lParam不够用时,可以将wParam就给拆成两个int16来使用
(12)SetForegroundWindow(handle)
指定窗体设置到最顶层,并且激活该窗口
handle # 窗口句柄
仅当满足下列条件之一为真时,进程才能设置前台窗口:
该过程是前台过程
该过程由前台进程启动
该进程接收到最后一个输入事件
没有前台进程
正在调试该过程
前台进程不是现代应用程序或“开始”屏幕
前台未锁定(请参见锁定设置前台窗口LockSetForegroundWindow)
前台锁定超时已过期(请参阅系统参数信息中的SPI_GETFOREGROUNDLOCKTIMEOUT)
没有处于活动状态的菜单
(1)OpenClipboard()
模拟剪贴板-打开剪贴板
(2)CloseClipboard()
模拟剪贴板-关闭剪贴板(注意:其他应用程序只能在剪贴板关闭之后才能访问,否则访问到的剪贴板为NULL)
(3) EmptyClipboard()
模拟剪贴板-清空剪贴板
(4)SetClipboardData(UINT uFormat,HANDLE hMem)
模拟剪贴板-给剪贴板添加数据
uFormat # 指定数据格式
CF_BITMAP/2 # 位图的句柄
CF_DIB/8 # 一个内存对象,其中包含一个位图信息结构,后跟位图位
CF_DIBV5/17 # 一个内存对象,其中包含位图V5头(翼型)结构,后跟位图颜色空间信息和位图位
CF_DIF/5 # 软件艺术的数据交换格式
CF_DSPBITMAP/0x0082 # 与私有格式关联的位图显示格式 CF_DSPENHMETAFILE/0x008E # 与私有格式关联的增强型图元文件显示格式 CF_DSPMETAFILEPICT/0x0083 # 与私有格式关联的图元文件-图片显示格式 CF_DSPTEXT/0x0081 # 与私有格式关联的文本显示格式
CF_ENHMETAFILE/14 # 增强型图元文件的句柄
hMem # 必须是前数据的句柄,而不是私有格式的数据
CF_GDIOBJFIRST/0x0300 # 应用程序定义的GDI对象剪贴板格式的整数值范围的开始 CF_GDIOBJLAST/0x03FF # 应用程序定义的GDI对象剪贴板格式的整数值范围的末尾 清空剪贴板时,使用GlobalFree函数不会自动删除与此范围内的剪贴板格式关联的句柄
hMem # 必须是全局Alloc函数分配的句柄,其GMEM_MOVEABLE标志,而不是GDI对象的句柄
CF_HDROP/15 # 用于键入HDROP的句柄,用于标识文件列表
应用程序可以通过将句柄传递给DragQueryFile函数来检索有关文件的信息
CF_LOCALE/16 # 数据是与剪贴板中的文本关联的区域设置标识符(LCID)的句柄(HGLOBAL)
关闭剪贴板时,如果剪贴板包含CF_TEXT数据但没有CF_LOCALE数据,系统会自动将CF_LOCALE格式设置为当前输入语言
可以使用CF_LOCALE格式将不同的区域设置与剪贴板文本相关联
从剪贴板粘贴文本的应用程序可以检索此格式,以确定用于生成文本的字符集
请注意,剪贴板不支持多个字符集的纯文本。若要实现此目的,请改用格式化的文本数据类型,如RTF
系统使用与CF_LOCALE关联的代码页隐式地从CF_TEXT转换为CF_UNICODETEXT。因此,正确的代码页表用于转换
CF_METAFILEPICT/3 # 由图元文件结构定义的图元文件图片格式的句柄
当通过DDE传递CF_METAFILEPICT句柄时,负责删除hMem的应用程序还应释放CF_METAFILEPICT句柄引用的图元文件
CF_OEMTEXT/7 # 包含OEM字符集中的字符的文本格式
每行都以回车符/换行符(CR-LF)组合结尾、空字符表示数据结束
CF_OWNERDISPLAY/0x0080 # 所有者显示格式
剪贴板所有者必须显示和更新剪贴板查看器窗口,并接收WM_ASKCBFORMATNAME、WM_HSCROLLCLIPBOARD、WM_PAINTCLIPBOARD、WM_SIZECLIPBOARD和WM_VSCROLLCLIPBOARD消息。
hMem # 必须为空
CF_PALETTE/9 # 调色板的手柄
每当应用程序在剪贴板中放置依赖于或假定调色板的数据时,它也应该将调色板放在剪贴板上
如果剪贴板包含CF_PALETTE(逻辑调色板)格式的数据,则应用程序应使用SelectPalette和 和RealizPalette函数来实现剪贴板中的任何其他数据与该逻辑调色板进行比较
显示剪贴板数据时,剪贴板始终使用剪贴板上CF_PALETTE格式的任何对象作为其当前调色板
CF_PENDATA/10 # 用于笔计算的微软视窗的笔扩展的数据
CF_PRIVATEFIRST/0x0200 # 私有剪贴板格式的整数值范围的开始 CF_PRIVATELAST/0x02FF # 私有剪贴板格式的整数值范围的结尾
与私人剪贴板格式关联的句柄不会自动释放;剪贴板所有者必须释放此类句柄,通常是为了响应WM_DESTROYCLIPBOARD消息
CF_RIFF/11 # 表示比CF_WAVE标准波形格式更复杂的音频数据
CF_SYLK/4 # 微软符号链接(SYLK)格式
CF_TEXT/1 # ANSI文本格式
每行都以回车符/换行符(CR-LF)组合结尾、空字符表示数据结束
CF_TIFF/6 # 标记图像文件格式
CF_UNICODETEXT/13 # Unicode编码文本格式
每行都以回车符/换行符(CR-LF)组合结尾、空字符表示数据结束
CF_WAVE/12 # 以标准波形格式之一表示音频数据,如11kHz或22kHz的脉冲编码调制(PCM)的音频数据
hMem # 指定格式的数据的句柄
此参数可以为NULL,表示窗口根据请求以指定的剪贴板格式(呈现格式)提供数据(延迟呈现)
如果窗口延迟呈现,则必须处理WM_RENDERFORMAT并WM_RENDERALLFORMATS消息
跨平台的操作鼠标和键盘的模块
(1)Linux --- Xlib
(2)Mac --- Quartz、AppKit
(3)0Windows --- pywin32、pyHook
(1)先导入PyUserInput
pip install PyUserInput
(2)创建键鼠对象
m = PyMouse() # 操作鼠标
k = PyKeyboard() # 操作键盘
(3)操作鼠标
x_dim, y_dim = m.screen_size() # 获取鼠标的坐标
m.click(x_dim,y_dim) # 在坐标位置点击
(4)操作键盘
k.type_string(str) # 键盘输入、发送判断文字
k.press_key(key) # 按住某键
k.release_key(key) # 松开某键
k.tap_key(key) # 按住并松开某键
k.tap_key(key,n=重复次数,interval=间歇时间) # 重复的间歇的按松某键
k.press_key(k.alt_key) # 按住Alt_L左键
k.release_key(k.alt_key) # 松开Alt_L左键
k.tap_key(k.tab_key) # 按松Tab键
k.press_keys(['Command',key1,key2]) # 按松组合键(Mac系统)
k.press_keys([key1,key2]) # 按松组合键(Windows系统)
k.tap_key(k.function_keys[n]) # 按松Fn功能键
numpad_keys = keypad = ['Space', 'Tab', 'Enter', 'F1', 'F2', 'F3', 'F4', 'Home', 'Left', 'Up', 'Right', 'Down', 'Prior', 'Page_Up', 'Next', 'Page_Down', 'End', 'Begin', 'Insert', 'Delete', 'Equal', 'Multiply', 'Add', 'Separator', 'Subtract', 'Decimal', 'Divide', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
k.tap_key(k.numpad_keys[key]) # 按松列表中功能键
k.tap_key(k.numpad_keys[key], n=重复次数) # 重复的按松功能键
(3)监听键鼠事件
PyMouseEvent() # 监听鼠标事件的输入
PyKeyboardEvent() # 监听键盘事件的输入
愿你我都能为中华民族的伟大复兴尽一份绵薄力量,让中华文化的根扎根在中国这片绿水青山之上,让新一代中华儿女传承与发扬!!!
---无名之辈
以上内容均是本人自学,当然是有网上公布的内容,如有冒犯,请留言,立即改正,谢谢!
看完要是觉得对自己有用,动一下您那根金色的会一指禅的右手食指,按一下您的鼠标左键,在对应的那个位置点个赞,亦或者在评论区留下您的绝顶好句,亦或者收藏在您的收藏夹里,再走也不迟嘛!您说要不要得!谢谢您的阅读和赞赏!