You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:40:39