自学Python+windows API自动化操作桌面功能

目    录

        一、windows API

        1、官方文档

        2、pywin32

        3、win32api

        4、win32gui

        5、win32clipboard

        二、windows API的另一种键鼠输入

        1、PyUserInput

         2、支持的平台及依赖

         3、方法


        一、windows API

        1、官方文档

        在官方文档中,可以查找到操作windows窗口的所有说明,无非是用C语言进行的解释,C语言的函数。但是理解起来并不是很困难,通过关键字去寻找对应的函数,每个函数中对应的参数的含义基本都能行得通,可以在其他语言中进行转换理解调用即可。如果你不理解英文,可以右键翻译中文,怎么方便怎么来。

        官方文档地址---Technical documentation | Microsoft Docs

        2、pywin32

        pywin32是Windows API的一种,主要包含windows常量、接口、线程以及COM机制等,自带IDE。是python中自动操作windows的重要驱动,所以在python自动化操作桌面前必须先安装pywin32。如果要有事件判断等操作,还需要安装pyHook

        安装命令:pip install pywin32、pip install pyHook

        3、win32api

.        (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  # 与鼠标事件关联的附加值

        4、win32gui

        (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)

没有处于活动状态的菜单

        5、win32clipboard

        (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消息


        二、windows API的另一种键鼠输入

        1、PyUserInput

        跨平台的操作鼠标和键盘的模块

         2、支持的平台及依赖

        (1)Linux --- Xlib

        (2)Mac --- Quartz、AppKit

        (3)0Windows --- pywin32、pyHook

         3、方法

        (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()          # 监听键盘事件的输入         


        愿你我都能为中华民族的伟大复兴尽一份绵薄力量,让中华文化的根扎根在中国这片绿水青山之上,让新一代中华儿女传承与发扬!!!

---无名之辈


以上内容均是本人自学,当然是有网上公布的内容,如有冒犯,请留言,立即改正,谢谢!


        看完要是觉得对自己有用,动一下您那根金色的会一指禅的右手食指,按一下您的鼠标左键,在对应的那个位置点个赞,亦或者在评论区留下您的绝顶好句,亦或者收藏在您的收藏夹里,再走也不迟嘛!您说要不要得!谢谢您的阅读和赞赏!

  • 6
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自学Python自动化测试是一种通过学习Python编程语言和相关测试框架,来实现自动化测试的方法。Python是一种简单易学的编程语言,广泛应用于软件开发和测试领域。以下是自学Python自动化测试的步骤和建议: 1. 学习Python基础知识:首先,你需要学习Python的基础知识,包括语法、数据类型、控制流等。可以通过在线教程、书籍或者视频教程来学习。 2. 学习自动化测试基础知识:了解自动化测试的基本概念和原理,包括测试金字塔、测试策略、测试工具等。可以通过阅读相关书籍或者参加培训课程来学习。 3. 学习Python测试框架:Python有很多成熟的测试框架,如unittest、pytest、nose等。选择一个适合你的项目和需求的测试框架,并学习其使用方法和特性。 4. 编写测试脚本:使用所选的测试框架,结合Python编程语言,编写测试脚本来实现自动化测试。可以通过编写单元测试、集成测试或者端到端测试来验证软件的功能和质量。 5. 学习Web自动化测试:如果你需要进行Web应用的自动化测试,可以学习相关的Web自动化测试框架,如Selenium、PyTest等。这些框架可以模拟用户在浏览器中的操作,实现自动化测试。 6. 实践和项目经验:通过实践和参与实际项目,不断提升自己的自动化测试技能。可以选择一些开源项目或者参加一些实际项目,积累经验并不断改进自己的测试脚本和方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值