Pywinauto操作第三方软件文件对话框:如何直接写入ToolbarWindow32类型的路径栏
我完全懂你现在的困扰——用pywinauto对接第三方软件的“打开”对话框时,文件名输入很顺畅,但碰到ToolbarWindow32类型的路径栏,直接写入就卡壳了,又不想靠pyautogui模拟Ctrl+L这种快捷键来绕路,对吧?
先给你拆解下问题:那个ToolbarWindow32控件可不是普通的输入框,它是Windows标准文件对话框里的地址工具栏,本质是Shell控件的封装,本身不支持常规的文本写入方法(比如set_text或者type_keys),所以你直接操作它肯定没用。
下面给你两个更优雅的解决方案,不用碰模拟按键:
方案一:利用Pywinauto对标准文件对话框的内置支持
如果这个“打开”对话框是Windows原生的标准对话框,那pywinauto其实已经帮你封装好了所有常用操作,根本不用自己去遍历控件找元素。直接用set_file_name或者set_path方法就能搞定:
from pywinauto import Application window_name = "Open" # window_name = "Apri" # 意大利语版本的对话框标题 # 注意这里建议用uia后端,对标准对话框的支持更完善 app = Application(backend="uia").connect(title=window_name) dlg = app.window(title=window_name) file_name = "Adam2.txt" file_path = r"C:\Test" # 直接设置完整的文件路径(路径+文件名),对话框会自动跳转到对应目录并填入文件名 dlg.set_file_name(rf"{file_path}\{file_name}") # 如果只想单独跳转到目标路径,不设置文件名,可以用这个: # dlg.set_path(file_path)
这个方法的好处是稳定可靠,不用关心底层控件结构,pywinauto会自动调用Windows Shell的接口来完成路径设置,比自己找控件靠谱多了。
方案二:针对自定义对话框,找到真正的输入控件
如果这个对话框是第三方软件自定义的(不是Windows原生的),那你可以试试用UIA后端深入控件树,找到ToolbarWindow32背后隐藏的实际输入控件。很多自定义对话框的地址栏看起来是工具栏,其实内部嵌套了一个常规的编辑框:
from pywinauto import Application app = Application(backend="uia").connect(title="Open") dlg = app.window(title=window_name) # 先定位到ToolbarWindow32控件,再找它的子编辑控件 address_toolbar = dlg.child_window(control_id=1001, class_name="ToolbarWindow32") address_edit = address_toolbar.child_window(class_name="Edit") # 现在就可以直接写入路径了 address_edit.set_text(file_path)
不过这个方法依赖于对话框的控件结构,如果第三方软件的自定义程度很高,可能需要你用print_control_identifiers()来仔细排查控件树:
dlg.print_control_identifiers()
这个命令会输出对话框所有控件的详细信息,你可以从中找到真正负责路径输入的那个控件。
最后再提一句
尽量别用pyautogui模拟按键,这种方法太依赖窗口位置和系统状态,稍微有点干扰(比如窗口被遮挡、输入法切换)就会出错。用pywinauto的原生控件操作或者内置方法才是更稳健的选择。
备注:内容来源于stack exchange,提问作者Chakot

