pywinauto调用wait_cpu_usage_lower时OpenProcess报参数错误如何解决
问题根因
这个(87, 'OpenProcess', '参数不正确')错误本质是调用wait_cpu_usage_lower时,Application实例绑定的进程PID已经失效,Windows找不到对应PID的进程,所以API调用返回参数错误。触发的原因有两个:
- explorer默认是单实例运行,调用
explorer.exe /select,xxx时,系统通常不会启动新的explorer进程,而是向已有的explorer主进程发送指令开新窗口,你启动的临时explorer进程会在指令发送后立刻退出,这时候按路径匹配到的如果是这个刚退出的临时进程,后续操作自然会报错 - 你用了两个独立的
Application实例分别执行start和connect,没有绑定启动时的正确PID,按path=explorer.exe匹配时很容易命中系统中已经存在的其他explorer进程(比如桌面主进程),甚至是还没完成初始化的过渡进程,等你调用CPU等待方法时进程状态已经异常
解决方案
- 不要拆分
start和connect的实例,也不要单纯按路径匹配explorer进程,优先通过窗口属性匹配进程,保证拿到的PID对应实际承载目标窗口的有效进程 - 先等待目标窗口完全创建成功,再执行CPU使用率等待逻辑,避免匹配到未就绪的进程
- 对该类偶发的PID失效错误增加重试逻辑,适配explorer的特殊进程机制
修复后代码示例
import time import pywintypes command = 'explorer.exe' Timings.slow() max_retry = 3 for retry in range(max_retry): try: Application().start(f'{command} /select,{item}') # 等待目标窗口出现后再关联进程,避免匹配到无效PID app = Application(backend='uia').connect(title_re=f'.*{base_name}.*', timeout=30) # 确认窗口可见后再等待CPU空闲 app.wait_for('visible', timeout=10) app.wait_cpu_usage_lower(threshold=0.5, timeout=60, usage_interval=1.0) break except pywintypes.error as e: if e.winerror == 87 and "OpenProcess" in str(e) and retry < max_retry - 1: time.sleep(2) continue raise
补充说明
你之前添加title_re匹配仍失败的原因是报错时窗口还没有渲染完成,connect的超时时间内窗口未出现,或者刚好匹配到了即将退出的临时进程,增加重试和窗口可见性校验后就能覆盖这类偶发场景。
内容的提问来源于stack exchange,提问作者noname7619
相关产品推荐
相关产品推荐

