使用pywinauto操作MGV6时如何识别菜单触发的新弹出子窗口
解决步骤
- 先给窗口预留加载时间,避免还未渲染完成就发起识别请求。触发菜单操作后可以先等待1~2秒,或者用pywinauto自带的等待机制判定窗口可见后再操作。
- 不要局限于原主窗口对象查找子窗口,部分软件的弹窗是独立顶层窗口,需要用全局
Desktop对象检索。 - 不确定窗口属性时,可以先打印当前MGV6进程关联的所有顶层窗口,确认弹窗的匹配规则。
完整示例代码
from pywinauto import Desktop, Application import time # 连接主程序 app = Application(backend="uia").connect(path="MGV6.exe") main_window = app.window(best_match="MGV 6 Teste - Toledo do Brasil") mgv_pid = app.process # 记录进程ID,后续过滤弹窗用 # 触发菜单打开弹窗 main_window.menu_select('Operações->Carga') # 等待弹窗加载,两种方案二选一即可 # 方案1:简单强制等待 time.sleep(2) # 方案2:显式等待弹窗出现,timeout可自行调整 # new_window = Desktop(backend="uia").window(process=mgv_pid, top_level_only=True).wait('visible', timeout=10) # 检索当前进程下的所有顶层窗口,打印控件属性确认弹窗的best_match、标题等信息 for win in Desktop(backend="uia").windows(process=mgv_pid, top_level_only=True): print(f"窗口标题:{win.window_text()},类名:{win.class_name()}") win.print_control_identifiers() # 打印该窗口下所有控件,找到你需要的bnt2按钮 # 确认匹配规则后,直接定位弹窗操作按钮,示例如下(替换成你实际的按钮匹配规则) # new_window = Desktop(backend="uia").window(process=mgv_pid, title="你查到的弹窗标题") # new_window.child_window(best_match="bnt2的匹配名").click()
常见排查点
- 如果还是识别不到,可尝试把backend换成
win32再试,部分老旧软件的控件对uia适配不好。 - 按钮识别时可以通过
control_type="Button"、auto_id、类名等多属性组合匹配,降低误识别概率。
内容的提问来源于stack exchange,提问作者spiritstr
相关产品推荐
相关产品推荐

