Skip to content

Latest commit

 

History

24 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 

Repository files navigation

源引 (Infix)

Windows 安装向导默认路径自动重定向与改写辅助工具

简体中文 | English


源引 (Infix) 是一个在 Windows 后台静默运行的系统辅助工具。目标是自动监听系统中使用标准 Windows 控件的安装向导(如 NSIS、Inno Setup、MSI),当检测到安装路径页面时,自动将默认安装路径重定向为你指定的目录(例如 D:\Apps),同时智能保留原安装包所指定的末级应用文件夹名,实现真正无感、有序的软件安装管理。

核心特性

智能路径改写与注入

  • 多通道控件搜索:优先使用 UI Automation (UIA) 架构扫描活动窗口元素,定位可能的安装路径输入框;对于不支持 UIA 树暴露的程序,降级回退至 Windows Win32 原生子窗口句柄 (Handle) 查询,确保高兼容性。
  • 智能保留末级目录:在重写安装前缀时,保留原有安装目标的最末级子文件夹名称(例如:将 C:\Program Files\Google\Chrome 改写为 D:\Apps\Google\Chrome),防止软件文件直接散落在根目录中。
  • 自动展开隐藏选项:智能检测页面上的“自定义安装”、“高级选项”等按钮。若路径框被隐藏,源引会自动执行模拟点击使其展开,确保改写逻辑被成功触发。
  • 自动推进推进 (Auto-Advance):路径成功写入后,可配置是否自动触发“下一步”、“继续”或“安装”按钮,加速安装流程。

免 UAC 高权限自启

  • 计划任务最高权限:优先通过 schtasks 命令,将源引注册为 Windows 任务计划程序中的随用户登录启动项,并赋予最高特权等级 (HIGHEST)。这使得软件在开机启动时能够直接获取管理员权限,而不会弹出任何 UAC (用户账户控制) 提示
  • 双轨自启备份:当系统受限导致无法创建计划任务时,源引会自动平滑回退至注册表 Run 启动项,最大程度保障自启功能可用。
  • 一键自检与修复:主程序提供一键“修复自启”功能,详细输出任务创建日志,并在界面展示计划任务存在状态、上次运行时间及运行结果代码。

托盘化与手动引导

  • 静默后台守护:开机后自动最小化到系统托盘常驻,双击托盘图标即可唤出主控制界面,日常使用零打扰。
  • 手动启动注入:提供“启动安装包”按钮,用户可手动选择 .exe.msi 安装文件启动,源引将尝试针对不同安装框架注入通用的安装路径命令行参数。

项目结构

infix/
├── src/
│   ├── Assets/                 # 应用图标与 UI 图片资源
│   ├── App.xaml                # WPF 应用生命周期与全局资源声明
│   ├── App.xaml.cs             # 应用程序初始化、托盘图标构建及单例守护进程逻辑
│   ├── AppNameResolver.cs      # 应用名称智能提取器 (用于保留末级目录名)
│   ├── AppSettings.cs          # 本地配置文件序列化实体
│   ├── Infix.csproj            # .NET 8.0 WPF 项目文件,定义了 SyncPortableExeAfterPublish 发布同步任务
│   ├── InstallPathPlanner.cs   # 路径重定向计算逻辑 (路径匹配与拼接规则)
│   ├── InstallerAutomation.cs  # 核心:UI Automation 与 Win32 控件探测、改写与模拟点击推进逻辑
│   ├── InstallerLaunchService.cs # 手动运行安装包辅助器,向第三方安装器注入 CLI 目录参数
│   ├── InstallerProcessWatcher.cs# 进程常驻 Watcher,基于 PeriodicTimer 高效且低开销轮询扫描安装程序
│   ├── MainWindow.xaml         # 主配置与自检诊断控制台 UI 界面
│   ├── MainWindow.xaml.cs      # 界面交互绑定、后台日志动态显示及修复逻辑
│   ├── NuGet.Config            # NuGet 依赖源配置文件
│   ├── PrivilegeHelper.cs      # Win32 进程权限、安全令牌及完整性级别 (Integrity Level) 探针工具
│   ├── README.md               # 源码级说明文档
│   ├── SelfTestRunner.cs       # 计划任务与自启参数的系统级别健康自检器
│   ├── SettingsService.cs      # 磁盘配置文件 (JSON) 加载与持久化服务
│   ├── StartupManager.cs       # 计划任务及注册表自启项注册、删除与状态查询控制器
│   ├── WindowActivationHelper.cs # 用于将目标安装器窗口强制激活至前台的辅助类
│   ├── app.manifest            # UAC 执行权限声明 (requireAdministrator)
│   ├── publish-lite.bat        # 依赖外部运行时的轻量发布构建脚本
│   └── publish-single-exe.bat  # 独立无依赖单文件发布构建脚本
├── Infix.exe                   # [编译生成] 根目录免安装独立版单文件 (已放入 .gitignore)
├── README.md                   # [本文] 项目中文自述文件
└── .gitignore                  # Git 忽略规则配置文件

环境要求

  • 运行环境:Windows 10 / Windows 11 (x64)
  • 开发环境:.NET 8.0 SDK (包含 WPF 工作负载)

快速开始

运行与开发

# 启动开发调试
dotnet run --project src/Infix.csproj

本地自检测试

# 运行本地编译后的程序并进入自检诊断模式
dotnet src/bin/Release/net8.0-windows/Infix.dll --self-test

编译发布

你可以选择编译为单文件绿色独立版,或者仅发布轻量版可执行文件。

1. 发布单文件免安装版(内置 .NET 运行时,推荐)

运行 src 文件夹下的发布脚本:

cd src
.\publish-single-exe.bat
  • 生成结果:编译生成的 Infix.exe 将被自动拷贝至项目的根目录下。
  • 特点:文件体积较大(约 70MB),但在目标机器上无需安装任何运行库即可直接运行。

2. 发布轻量依赖版

运行 src 文件夹下的轻量发布脚本:

cd src
.\publish-lite.bat
  • 生成结果:在根目录下生成 Infix-lite.exe
  • 特点:文件体积非常小(仅数百KB),但需要目标计算机上已安装 .NET 8.0 Desktop Runtime

核心工作逻辑

源引在后台通过轮询和事件驱动的组合方式运作,当检测到潜在的安装包运行时,执行以下流程:

graph TD
    A[启动后台进程监听 Watcher] --> B{是否存在匹配的安装包进程?}
    B -- 否: 睡眠 500ms --> A
    B -- 是: 获取进程主窗口 --> C[1. 采用 UI Automation 搜索路径输入框]
    C -- 探测到路径输入节点 --> E[智能解析当前路径并保留末级应用目录]
    C -- 未探测到路径节点 --> D[2. 回退至 Win32 消息通道检索 Edit 控件句柄]
    D -- 探测到控件句柄 --> E
    D -- 未探测到控件句柄 --> F{是否含有自定义/高级等展开按钮?}
    F -- 有: 模拟点击展开按钮 --> C
    F -- 无 --> G[暂不做改动,等待下次扫描]
    E --> H[向输入框中写入重定向目标路径]
    H --> I{是否启用了自动推进功能?}
    I -- 是 --> J[检索下一步/安装按钮并模拟点击]
    I -- 否 --> K[改写完成]
    J --> K
    K --> G
Loading

常见问题 (FAQ)

为什么部分软件的安装包无法自动修改路径?

源引只针对采用标准 Windows 控件的安装程序。例如使用 NSIS, Inno Setup, InstallShield, MSI 开发的常规安装器,能够成功探测到路径输入框并进行改写。 对于如下类型的安装界面,由于其内部没有暴露符合 Windows 标准的控件元素,程序将无法识别:

  • 自绘皮肤界面(如早期的 DirectUI、各类定制化炫彩皮肤)
  • 基于 网页套壳/HTML 开发的安装包
  • 完全非标定制的独立安装器

为什么必须以管理员权限运行?

Windows 操作系统的安全边界设计了**“特权等级隔离”**。如果一个安装包是以管理员权限启动的,那么较低权限运行的程序是无法向其窗口发送改写消息或调用 API 的。因此源引默认也必须以管理员身份运行。

计划任务自启和普通自启有什么区别?

  • 计划任务启动:利用系统的计划任务程序,在用户登录时直接以 HIGHEST (最高管理员特权) 权限唤醒。此方式由系统服务直接托管,完全不会触发开机 UAC 弹窗警告,体验最平滑。
  • 注册表常规启动:如果系统权限受限无法写入计划任务,则作为备份手段注册在 HKEY_CURRENT_USER\...\Run 中。但再次开机时,由于需要管理员权限,每次开机都会弹出 Windows 系统的 UAC 提示框

贡献指南

  1. Fork 本项目到你的 GitHub 仓库。
  2. 新建你的开发分支:git checkout -b feature/awesome-feature
  3. 提交你的修改并附带有意义的提交消息。
  4. 推送到你的远程分支,并在本仓库发起一个 Pull Request (PR)

许可证

本项目基于 MIT License 许可协议开源。


致谢


免责声明:本项目为非官方开源系统辅助工具,主要用于提高个人软件安装的便携性。自动修改路径过程受第三方软件兼容性影响,运行中请仔细核对安装包中实际最终写入的路径,作者不对因路径异常导致的数据损坏或安装失败承担任何责任。

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages