如何在Python中获取system()打开特定文件类型的关联exe程序?
解决Python中通过关联程序打开文件并调整窗口位置的问题
问题分析
原代码的核心错误:
app.start()需要传入可执行程序的启动命令,而os.system()返回的是命令执行的退出码,并非有效启动指令- 直接将PDF文件路径传给
app.start()无效,因为pywinauto需要明确的可执行程序启动参数
解决方案步骤
1. 获取系统关联的PDF阅读器路径
Windows系统的文件类型默认关联程序路径存储在注册表中,可通过winreg模块读取:
import winreg def get_default_program(file_ext): # 读取文件类型对应的ProgID with winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, file_ext) as ext_key: prog_id = winreg.QueryValue(ext_key, None) # 通过ProgID获取启动命令 with winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, f"{prog_id}\\shell\\open\\command") as cmd_key: cmd = winreg.QueryValue(cmd_key, None) # 提取纯可执行程序路径(剔除参数部分) if cmd.startswith('"'): return cmd.split('"')[1] else: return cmd.split()[0] # 获取PDF默认阅读器路径 pdf_reader = get_default_program(".pdf")
2. 启动程序并调整窗口位置
用pywinauto启动阅读器并指定目标文件,再定位窗口调整位置:
import ctypes import pywinauto # 获取屏幕分辨率 user32 = ctypes.windll.user32 screensX = user32.GetSystemMetrics(0) screensY = user32.GetSystemMetrics(1) xdiv2 = screensX / 2 ydiv2 = screensY / 2 # 启动阅读器并打开目标PDF app = pywinauto.application.Application() app.start(f'"{pdf_reader}" "Simplicity_TheFinerArtOfCreatingSoftware_CheatSheet_1Page.pdf"') # 定位窗口(可根据程序特性调整,这里用文件名正则匹配) window = app.window(title_re=".*Simplicity.*") # 也可通过窗口类名定位,比如Adobe Reader的类名是"AcrobatSDIWindow",Chrome是"Chrome_WidgetWin_1" # window = app.window(class_name="AcrobatSDIWindow") # 调整窗口位置与大小 window.move_window(x=-50, y=0, width=xdiv2, height=ydiv2, repaint=True)
关键说明
- 注册表读取方法适用于所有Windows文件类型的关联程序查询,不限于PDF
- 窗口定位时,正则匹配标题或指定窗口类名都可,类名定位更精准
- 启动命令中用双引号包裹路径,避免路径含空格时触发错误
内容的提问来源于stack exchange,提问作者Jelte Dijkmans
相关产品推荐
相关产品推荐

