能否使用pywinauto自动化操作Avast Business Antivirus?
问题根因
Avast Business Antivirus的UI基于Electron(Chromium内核)开发,默认不会将内部DOM控件暴露给Windows UI Automation接口,因此你用uia后端只能识别到外层的Chrome Legacy Window容器,看不到内部的Menu、Notification等具体控件;而win32后端天生不支持Electron类应用的控件识别,所以会抛出内存访问相关的报错。
可行解决方案
方案1:开启Electron应用的 accessibility 支持(推荐)
Electron支持通过--force-renderer-accessibility启动参数强制开启可访问性支持,让内部控件暴露给UIA接口,修改启动代码即可:
from pywinauto.application import Application import time # 启动时增加参数开启可访问性支持,路径前加r避免转义错误 app = Application(backend='uia').start( r'C:\Program Files\AVAST Software\Avast\AvastUI.exe --force-renderer-accessibility' ).connect(title='Avast Business Antivirus', timeout=100) # 等待窗口完全加载完成 time.sleep(3) # 此时再打印控件树即可看到Menu按钮 app.AvastBusinessAntivirus.print_control_identifiers()
打印控件树后找到Menu按钮对应的控件名/automation_id,直接调用.click()方法即可完成点击。
方案2:固定坐标点击(适配性一般,适合自用场景)
如果上述参数不生效(部分定制Electron应用会禁用该参数),可以直接通过固定相对坐标点击Menu按钮,Menu按钮在Avast窗口中的相对位置是固定的,你可以先手动测量偏移值后使用:
from pywinauto.application import Application import pywinauto.mouse as mouse app = Application(backend='uia').start( r'C:\Program Files\AVAST Software\Avast\AvastUI.exe' ).connect(title='Avast Business Antivirus', timeout=100) main_window = app.AvastBusinessAntivirus win_left, win_top = main_window.rectangle().left, main_window.rectangle().top # 偏移值根据实际情况调整,示例为相对于窗口左上角向右1300px、向下20px的位置 click_x = win_left + 1300 click_y = win_top + 20 mouse.click(coords=(click_x, click_y))
方案3:图像识别点击(适配窗口大小变化场景)
如果Avast窗口大小不固定,可以用图像识别匹配Menu按钮的位置后点击,提前截取清晰的Menu按钮小图存为menu.png放在脚本同目录即可:
from pywinauto.application import Application import pywinauto.mouse as mouse from pywinauto.image import ImageFinder app = Application(backend='uia').start( r'C:\Program Files\AVAST Software\Avast\AvastUI.exe' ).connect(title='Avast Business Antivirus', timeout=100) main_window = app.AvastBusinessAntivirus # 匹配Menu按钮的位置 menu_rect = ImageFinder.find(r'menu.png', main_window.capture_as_image()) if menu_rect: # 计算按钮中心坐标进行点击 click_x = main_window.rectangle().left + menu_rect[0] + menu_rect[2]//2 click_y = main_window.rectangle().top + menu_rect[1] + menu_rect[3]//2 mouse.click(coords=(click_x, click_y))
注意事项
Avast作为安全软件自带自我保护机制,若模拟点击无响应,可以尝试临时关闭Avast的自我保护开关,或者使用管理员权限运行Python脚本。
内容的提问来源于stack exchange,提问作者gmfredit
相关产品推荐
相关产品推荐

