前言:
此时看官们对“pythonwin32process”可能比较珍视,各位老铁们都想要学习一些“pythonwin32process”的相关资讯。那么小编同时在网上收集了一些对于“pythonwin32process””的相关知识,希望各位老铁们能喜欢,大家一起来了解一下吧!pywinauto 简单使用
pywinauto是一组实现windows GUI窗口自动化的python模块。使用pywinauto可以方便的给窗口发送鼠标、键盘事件,使用python程序控制程序窗口。主要是针对CS程序自动化应用。必须是GUI程序。
参考:
1. 官网解释
大概意思就是程序有两种backend,win32 (默认是这个)和 uia, 针对不同的backend 有不同的窗体检测工具。
Spy++ (定位元素工具(win32))Inspect(定位元素工具(uia))UI Spy (定位元素工具)Swapy(可简单生成pywinauto代码)
下面例子用 spy++ ,一个小型的压缩包,解压后就可以使用。
2. 简单使用
可以简单理解,如果要想操作,肯定是需要启动一个程序、或者连接到一个已经存在的APP,然后获取其相关窗口、对话框等控件元素进行操作
0. spy++ 简单使用
spy++ 可以用于定位一些app的相关的class、title 等信息,也可以定位内部的窗口:
(1).找到如下按钮
(2)拖到对应app的窗口会提示相关的句柄、title、class 等信息, 比如拖到记事本显示信息如下:
1. 启动和定位APP以及查看包含哪些组件
import pywinautofrom pywinauto.application import Application# 获取一个APP的方法# 第一个是启动, start(默认超时是5s)app = Application().start('notepad.exe')dlg = app.window(title='无标题 - 记事本')print(dlg.__class__)dlg.print_control_identifiers()print('======')# 第二个是获取, 根据title 获取。 从所有应用程序直接获取app1 = pywinauto.Desktop()dlg1 = app1['无标题 - 记事本']print(dlg1.__class__)dlg1.print_control_identifiers()
结果:
<class 'pywinauto.application.WindowSpecification'>Control Identifiers:Notepad - '无标题 - 记事本' (L48, T259, R1345, B807)['Notepad', '无标题 - 记事本Notepad', '无标题 - 记事本']child_window(title="无标题 - 记事本", class_name="Notepad") | | Edit - '' (L56, T310, R1337, B777) | ['Edit', '无标题 - 记事本Edit'] | child_window(class_name="Edit") | | StatusBar - '' (L56, T777, R1337, B799) | ['StatusBar', '无标题 - 记事本StatusBar', 'StatusBar 第 1 行,第 1 列', 'StatusBar Windows (CRLF)', 'StatusBar100%'] | child_window(class_name="msctls_statusbar32")======<class 'pywinauto.application.WindowSpecification'>Control Identifiers:Notepad - '无标题 - 记事本' (L48, T259, R1345, B807)['Notepad', '无标题 - 记事本Notepad', '无标题 - 记事本']child_window(title="无标题 - 记事本", class_name="Notepad") | | Edit - '' (L56, T310, R1337, B777) | ['Edit', '无标题 - 记事本Edit'] | child_window(class_name="Edit") | | StatusBar - '' (L56, T777, R1337, B799) | ['StatusBar', '无标题 - 记事本StatusBar', 'StatusBar 第 1 行,第 1 列', 'StatusBar Windows (CRLF)', 'StatusBar100%'] | child_window(class_name="msctls_statusbar32")
也可以根据processId 、句柄、class_name 、title等获取,当然可以组合
# 获取一个APP的方法# 根据进程ID获取# app = Application().connect(process=22972)# 根据句柄获取,句柄可以用spy++ 点击后查看到# app = Application().connect(handle=0x0051082A)# 根据class_name 获取,属性值可以用spy++ 获取from pywinauto import Applicationapp = Application().connect(class_name='Notepad')dlg = app.window().print_control_identifiers()
结果:
Control Identifiers:Notepad - '无标题 - 记事本' (L-32000, T-32000, R-31840, B-31972)['Notepad', '无标题 - 记事本Notepad', '无标题 - 记事本']child_window(title="无标题 - 记事本", class_name="Notepad") | | Edit - '' (L-32000, T-32000, R-30719, B-31533) | ['Edit', '无标题 - 记事本Edit'] | child_window(class_name="Edit") | | StatusBar - '' (L-32000, T-31533, R-30719, B-31511) | ['StatusBar Windows (CRLF)', 'StatusBar100%', 'StatusBar 第 1 行,第 1 列', '无标题 - 记事本StatusBar', 'StatusBar'] | child_window(class_name="msctls_statusbar32")2. 遍历打印该窗口所有的菜单
from pywinauto import Application'''通过 menu().items() 可以获取当前级次下的菜单项,再通过 sub_menu() 判断是有下级菜单项,不断的递归,把所有的菜单项打印出来'''def list_menu(menu_item, space): ''' 作用:递归法遍历菜单 ''' for i in menu_item.items(): if (len(i.text()) > 0): print(space + i.text()) if (i.sub_menu() != None): list_menu(i.sub_menu(), " " + space)app = Application().connect(class_name='Notepad')dlg = app.window()list_menu(dlg.menu(), "")
结果:
Control Identifiers:Notepad - '无标题 - 记事本' (L-8, T-8, R1928, B1048)['Notepad', '无标题 - 记事本', '无标题 - 记事本Notepad']child_window(title="无标题 - 记事本", class_name="Notepad") | | Edit - '' (L0, T43, R1920, B1018) | ['Edit'] | child_window(class_name="Edit") | | StatusBar - '' (L0, T1018, R1920, B1040) | ['StatusBar Windows (CRLF)', '无标题 - 记事本StatusBar', 'StatusBar100%', 'StatusBar 第 1 行,第 1 列', 'StatusBar'] | child_window(class_name="msctls_statusbar32")文件(&F) 新建(&N) Ctrl+N 打开(&O)... Ctrl+O 保存(&S) Ctrl+S 另存为(&A)... 页面设置(&U)... 打印(&P)... Ctrl+P 退出(&X)编辑(&E) 撤消(&U) Ctrl+Z 剪切(&T) Ctrl+X 复制(&C) Ctrl+C 粘贴(&P) Ctrl+V 删除(&L) Del &使用 Bing 搜索... Ctrl+E 查找(&F)... Ctrl+F 查找下一个(&N) F3 替换(&R)... Ctrl+H 转到(&G)... Ctrl+G 全选(&A) Ctrl+A 时间/日期(&D) F5格式(&O) 自动换行(&W) 字体(&F)...查看(&V) 缩放(&Z) &放大 Ctrl+Plus &缩小 Ctrl+Minus &恢复默认缩放 Ctrl+0 状态栏(&S)帮助(&H) 查看帮助(&H) 关于记事本(&A)4. 找子窗口
from pywinauto import Applicationapp = Application().connect(class_name='Notepad')dlg = app.window()print(dlg)# 找子窗口dlg2 = dlg.child_window(class_name='Edit')print(dlg2)print(dlg.Edit)print(dlg['Edit'])
如果找不到元素或者找到多个元素,直接调用方法会报错,解决办法就是自己通过下标指定index(可以结合下面draw_outline 划线 来定位元素)
saveasAppWindow.child_window(class_name='ToolbarWindow32', found_index=3).click()5. 对找到的元素打标记
from pywinauto import Applicationapp = Application().connect(class_name='Notepad')dlg = app.window()print(dlg)# 找子窗口dlg2 = dlg.child_window(class_name='Edit')dlg2.draw_outline(colour = 'red')
结果: 会用红线标记找到的元素
3. 键盘和点击事件
如下例子,打开记事本,输入一些字符串然后另存为E:/1.txt
'''1. 打开记事本2. 在编辑区域输入pywinauto Works!3. 点击菜单栏的 文件->另存为4. 在另存为窗口输入路径: E:\\5. 名称输入 1.txt6. 点击确定按钮'''from pywinauto import Applicationfrom pywinauto.keyboard import send_keys'''在记事本窗口操作'''# 打开记事本app = Application().start('notepad.exe')dlg = app.window(title='无标题 - 记事本')# 找到编辑区域输入内容dlg.child_window(class_name='Edit').type_keys("pywinauto Works!", with_spaces=True)# 选择菜单, 文件->另存为dlg.menu_select("文件(&F)->另存为(&A)")'''在另存为窗口操作'''# 输入的对话框输入路径和文件名称然后点击确定# 选择文件(pywinauto自动选择)saveasApp = Application().connect(title='另存为')saveasAppWindow = saveasApp.window(found_index=0)# 选择文件上传的窗口# 1. 上面路径选择窗口: 点击 -》 输入路径 -》 回车# 选择文件地址输入框,点击saveasAppWindow.child_window(class_name='ToolbarWindow32', found_index=3).click()# 键盘输入上传文件的路径send_keys("E:\\")# 键盘输入回车,打开该路径send_keys("{VK_RETURN}")# 2. 名称按钮输入名称saveasAppWindow['Edit'].type_keys("1.txt")# 3. 保存按钮点击saveasAppWindow.child_window(title='保存(&S)').click()
结果和期望的一样会自动进行一系列操作。
pyautogui 简单使用
感觉这个更加方便,这个不依赖于平台,就是类似于手动去操作鼠标键盘。进行一系列的事件。
1. 安装
pip install pyautogui2. 简单使用
import timeimport pyautoguitime.sleep(1)# 获取窗口大小# x1, y1 = pyautogui.size()# print(x1, y1)# 结果是鼠标当前位置,可以想象成以屏幕左上角为原点的第一象限# x, y = pyautogui.position()# print(x, y)# 判断像素是否在屏幕上# result = pyautogui.onScreen(100000, 1)# print(result)# 鼠标函数# 鼠标移动到(x,y),整个过程持续1s# pyautogui.moveTo(500, 500, 1)# 相当于按下左键拖动到x, y# pyautogui.dragTo(500, 500, 1)# 鼠标左键点击(x,y)# pyautogui.click(24, 38)# pyautogui.rightClick(770, 380)# 中击# pyautogui.middleClick(770, 380)# 双击# pyautogui.doubleClick(770, 380)# 三击# pyautogui.tripleClick(770, 380)# 鼠标在(x,y)滚动# pyautogui.scroll(770, 380)# 鼠标按下, 可以指定鼠标按键。同理mouseUp为鼠标松开# pyautogui.mouseDown(24, 38, button='left')# pyautogui.mouseDown(770, 380, button='right')# 键盘函数# 输入"hello"# pyautogui.typewrite("hello")# 依次输入"a","b","c"# pyautogui.typewrite(['a','b','c'])# 按键ctrl+c# pyautogui.hotkey('ctrl', 'a')# pyautogui.hotkey('ctrl', 'c')# pyautogui.hotkey('ctrl', 'v')# pyautogui.hotkey('ctrl', 'v')# 按下键盘# pyautogui.keyDown('a')# pyautogui.keyUp('a')# pyautogui.keyDown('b')# pyautogui.keyUp('b')# 提示框相关,类似JS的三种框# alert, confirm, prompt, passwordalert = pyautogui.alert('stop')print(alert)va1 = pyautogui.confirm('stop')print(va1)prompt = pyautogui.prompt('stop')print(prompt)password = pyautogui.password('stop')print(password)# 屏幕截图# region参数,截图区域,由左上角坐标、宽度、高度4个值确定,如果指定区域超出了屏幕范围,超出部分会被黑色填充,默认`None`,截全屏# pyautogui.screenshot('E:/shot{}.png'.format(1), region=(0, 0, x1, y1))
这里需要注意。selenium 获取到的元素是相对于浏览器左上角为坐标,高度等信息不包含菜单栏。结合使用需要注意菜单栏的高度。
标签: #pythonwin32process