# -*- coding: utf-8 -*- # @Author: Luxuan # @Date: 2024-05-23 21:50:44 # @Last Modified by: Luxuan # @Last Modified time: 2024-05-25 11:07:03 import pyautogui as pag import pywinauto import win32gui import win32con import uiautomation as uiauto import psutil from PIL import ImageGrab,ImageSequence class WinUIBase(object): def __init__(self): self.app = None pass def launcher(self, app_name, backend='win32',timeout=2): """ :param app_name: app进程名称或者app路径 :return: """ pid_list = self._check_processes(app_name) if len(pid_list) == 0: self.app = pywinauto.application.Application(backend=backend).start(app_name, timeout=timeout, retry_interval=2) else: pid = pid_list[0] self.app = pywinauto.application.Application(backend=backend).connect(process=pid, timeout=timeout, retry_interval=2) pass def find_window(self, win_title): win = None try: win = self.app.window(title_re=win_title) # self.main_win.maximize() win.wait(wait_for='visible', timeout=3, retry_interval=2) # time.sleep(0.2) return win except Exception as e: print(e) return win pass def show_mode(self,win,mode): if mode=="max": win.maximize() elif mode=="min": pass elif mode=="focus": pass elif mode=="top": pass pass def get_window(self,name): wins = self.app.windows() win_items = [x for x in wins if x.element_info.name==name] if len(win_items)>0: return win_items[0] return None def get_childers(self,control,auto_id = None, class_name = None, name= None): childers = control.descendants() if auto_id: childers = [x for x in childers if x.handle==auto_id] elif class_name: childers = [x for x in childers if x.element_info.class_name==class_name] elif name: childers = [x for x in childers if x.element_info.name==name] if len(childers)==1: return childers[0] return childers pass def close_popups(self,win,set_show=False): try: popup_hwnd = win.popup_window() if not popup_hwnd or not set_show: return popup_window = self.app.window(handle=popup_hwnd) popup_window.wait(wait_for='visible', timeout=1) popup_window.set_focus() # popup_window.close() popup_window.type_keys("{ENTER}") except Exception as e: print(e) pass def _check_processes(self, app_name): pid_list = [] processes = psutil.process_iter() for process in processes: try: name = process.name() # conns = process.connections() exe = process.exe() if app_name in name or app_name == exe: pid_list.append(process.pid) except Exception as e: print(e) return pid_list pass if __name__ == "__main__": pass """ pywinauto What is pywinauto — pywinauto 0.6.8 documentation https://pywinauto.readthedocs.io/en/latest/ GitHub - 2gis/Winium.Desktop: Winium.Desktop is Selenium Remote WebDriver implementation for automated testing of Windows application based on WinFroms and WPF platforms. https://github.com/2gis/Winium.Desktop app2.window(title_re ='Form',class_name_re="WindowsForms10").wait('ready', timeout=10) 打印所有子控件 print_control_identifiers() win.type_keys('{F5}') app = Application(backend='win32').start('notepad.exe') mainwin = app['无标题 - 记事本'] mainwin.Edit.type_keys("自动化输入第一行", with_spaces = True) mainwin.child_window(class_name="Edit").type_keys("{ENTER} 自动化输入第二行", with_spaces = True) mainwin.menu_select('文件 -> 保存') app['另存为']['文件名 Edit'].set_text(r'D:\temp\test_pywa\pywa.txt') app['另存为']['保存 Button'].click() app['pywa.txt - 记事本'].type_keys('%FX') send_keys('^a^c') # select all (Ctrl+A) and copy to clipboard (Ctrl+C) send_keys('+{INS}') # insert from clipboard (Shift+Ins) send_keys('%{F4}') # close an active window with Alt+F4 截图 bmp = win.capture_as_image() pywinauto客户端自动化---窗口进行截图 - 测试-安静 - 博客园 https://www.cnblogs.com/qican/p/13262198.html Python图像库PIL的类Image及其方法介绍_python pil image-CSDN博客 https://blog.csdn.net/leemboy/article/details/83792729 im.getpixel((0,0)) Python 查找句柄与控件信息(pywinauto库)_pywinauto edit-CSDN博客 https://blog.csdn.net/lylelo/article/details/120214006 app[window_title].menu_select("File->open") 使用pywinauto,如何获取静态文本对象的文本,鉴于父对话框的手柄 - VoidCC http://cn.voidcc.com/question/p-obaazoml-x.html indow_handle = pywinauto.findwindows.find_windows(title = u'My Dialog Name') # 返回应用程序当前顶部窗口,是WindowSpecification对象,可以继续使用对象的方法往下继续查找控件 app.top_window() dlg.close() # 关闭界面 dlg.minimize() # 最小化界面 dlg.maximize() # 最大化界面 dlg.restore() # 将窗口恢复为正常大小,比如最小化的让他正常显示在桌面 dlg.get_show_state() # 正常0,最大化1,最小化2 # 移动鼠标 mouse.move(coords=(x, y)) # 指定位置,鼠标左击 mouse.click(button='left', coords=(40, 40)) # 鼠标双击 mouse.double_click(button='left', coords=(140, 40)) # 将属性移动到(140,40)坐标处按下 mouse.press(button='left', coords=(140, 40)) # 将鼠标移动到(300,40)坐标处释放, mouse.release(button='left', coords=(300, 40)) # 右键单击指定坐标 mouse.right_click(coords=(400, 400)) keyboard.send('enter') keyboard.send('ctrl+v') handle = window.handle 【python句柄获取】——简单明了的获取窗口句柄,并使用句柄操作获取相应内容(全网最详细)_python获取窗口句柄-CSDN博客 https://blog.csdn.net/weixin_46625757/article/details/122498299 # 通过句柄窗口置顶 win32gui.SetWindowPos('句柄值', win32con.HWND_TOPMOST, 0, 0, 0, 0,win32con.SWP_NOMOVE | win32con.SWP_NOACTIVATE | win32con.SWP_NOOWNERZORDER | win32con.SWP_SHOWWINDOW | win32con.SWP_NOSIZE) # 通过句柄取消窗口置顶 def set_down(hwnd): win32gui.SetWindowPos(hwnd, win32con.HWND_NOTOPMOST, 0, 0, 0, 0, win32con.SWP_SHOWWINDOW | win32con.SWP_NOSIZE | win32con.SWP_NOMOVE) set_down("句柄值") # 通过句柄将窗口放到最前 win32gui.SetForegroundWindow("句柄值") # 通过窗口句柄【最大化窗口】 win32gui.ShowWindow('句柄值', win32con.SW_MAXIMIZE) # 通过窗口句柄【最小化窗口】 win32gui.ShowWindow('句柄值', win32con.SW_MINIMIZE) # 通过窗口句柄【关闭当前句柄控件】 # 是关闭单个句柄控件,不是关闭整个程序,只能关闭输入的句柄值 win32gui.SendMessage('句柄值', win32con.WM_CLOSE) # 在打开此文件所在文件夹并【定位到此文件】 FILE = 'C:/Windows/System32/notepad.exe' subprocess.Popen(f'explorer.exe /select,{FILE}', shell=False) #通过窗口标题获取句柄 hld = win32gui.FindWindow(None,u"此电脑") """