目录

在pywinauto中主要有两种对象可以建立这种入口点:
①Application:Application的作用范围是一个进程,如一般的桌面应用程序都为此类。应用的作用范围是一个进程,如一般的桌面应用程序都为此类。
②Desktop:Desktop的作用范围可以跨进程。主要用于一个程序可以包含多个实例(进程)的程序。
- from pywinauto import application, findbestmatch, findwindows, keyboard, mouse, timings
- import os, time
-
- os.environ.update({"__COMPAT_LAYER": "RUnAsInvoker"}) # 以管理员权限打开
-
- # 打开指定程序
- # 1、打开windows自带的应用:记事本
- app = application.Application(backend='uia').start('notepad.exe')
- # 2、打开指定应用
- # app = application.Application(backend='uia').start(r'E:\磁盘分区\DiskGenius\DiskGenius.exe') # 非全局使用应用决定路径
启动应用报错:
- Traceback (most recent call last):
- File "D:\python\lib\site-packages\pywinauto\application.py", line 1038, in start
- (h_process, _, dw_process_id, _) = win32process.CreateProcess(
- pywintypes.error: (740, 'CreateProcess', '请求的操作需要提升。')
-
- During handling of the above exception, another exception occurred:
-
- Traceback (most recent call last):
- File "D:\zhuomian\pywinauto\main.py", line 10, in <module>
- app = application.Application(backend='uia').start(r'E:\磁盘分区\DiskGenius\DiskGenius.exe')
- File "D:\python\lib\site-packages\pywinauto\application.py", line 1052, in start
- raise AppStartError(message)
- pywinauto.application.AppStartError: Could not create the process "E:\磁盘分区\DiskGenius\DiskGenius.exe"
- Error returned by CreateProcess: (740, 'CreateProcess', '请求的操作需要提升。')
需要设置管理员权限打开,设置方法两种:
- # 方法一:
- import ctypes, sys
-
-
- def is_admin():
- try:
- return ctypes.windll.shell32.IsUserAnAdmin()
- except:
- return False
-
-
- if is_admin():
- # 这里写入需要管理员权限执行的操作
- app = application.Application(backend='uia').start(r'E:\磁盘分区\DiskGenius\DiskGenius.exe')
- else:
- if sys.version_info[0] == 3:
- ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
- # 方法二: 速度快,推荐使用
- os.environ.update({"__COMPAT_LAYER": "RUnAsInvoker"})
- # 连接方法1:通过进程号连接
- # app = Application('uia').connect(process=14564)
- # 连接方法2:通过句柄连接
- app = Application('uia').connect(handle=5508946)
方便查找连接对象的方法,获取进程号或句柄:
- from pywinauto import application, findbestmatch, findwindows, keyboard, mouse, timings
- print(application.process_get_modules()) # 获取当前所有的进程及进程号
- print(findwindows.find_elements(title='无标题 - 记事本')) # 可以获取指定标题的进程及句柄
- win.maximize() # 窗口最大化
- print(win.get_show_state()) # 窗口状态,最大化为1,正常为0
- win.restore() # 窗口正常大小
- # win.minimize() # 窗口最小化
- print(win.rectangle()) # 获取窗口坐标 结果如(L524, T360, R1470, B851)
- win.close() # 关闭窗口

控件选择
1、根据窗口标题或类名选择:dlg = app[窗口类名/标题] 适合非英文程序或者类名中有空格等特殊符号
2、根据窗口类名选择窗口dlg = app.窗口类名
3、child_window()
- file = win['应用程序'].child_window(title="文件(F)", control_type="MenuItem")
- print(file.print_control_identifiers())
框选控件
- file = win['应用程序'].child_window(title="文件(F)", control_type="MenuItem")
- file.draw_outline() # 可以修改颜色和遍框粗细,默认为绿色

控件截图
- pic1 = win.capture_as_image() # 窗口截图
- pic1.save('p1.png')
- pic2 = file.capture_as_image() # 控件截图
- pic2.save('p2.png')
获取控件属性
- print(win.wrapper_object()) # wrapper_object()获取控件的类型
- print(dir(win['应用程序'].child_window(title="文件(F)",
- control_type="MenuItem").wrapper_object())) # dir(a.wrapper_object())获取控件的所有属性
- print(win.children()) # children()获取控件的子元素
- print(win.texts()) # texts()获取控件文本内容
- print(win.class_name()) # 获取控件类名
- print(win.get_properties()) # 以字典形式返回控件属性
菜单控件操作
- print(win['应用程序'].items()) # items()获取菜单的子菜单项
- print(win['应用程序'].item_by_index(1)) # item_by_index()通过下标选择对应的菜单项
-
- rep = win['应用程序'].item_by_path('编辑(E)->替换(R)...') # item_by_path()通过路径选择菜单项
- rep.click_input() # 点击菜单
- win.menu_select('编辑(E)->替换(R)...') # 一步执行上面两行
获取对象坐标中心点
- bt = app['无标题 - 记事本']['应用程序'].child_window(title="文件(F)", control_type="MenuItem")
- point = bt.rectangle().mid_point() # rectangle()获取坐标;mid_point()获取坐标的中心点(x,y)
- print('X坐标是{}\nY坐标是{}'.format(point.x, point.y)) # 获取中心点坐标方便我们点击元素
获取当前应用的所有窗口
获取当前应用的所有窗口,只能是应用主体对象,不能是菜单控件等,top_window()定位方法:此方法可返回应用软件的最顶层窗口(是窗口,不是窗口弹出的对话框)
print(app.top_window().print_control_identifiers()) # sub_menu() 判断是否有下级菜单项,不断的递归