ProcessProxy 是一个基于 WPF + .NET 8 + sing-box 的 Windows 桌面进程代理工具。

它的核心目标不是做系统全局代理,而是让你只为指定进程启用代理:你可以手动添加进程名、选择可执行文件,或通过准星拖拽捕获窗口所属进程,然后将这些进程及其子进程的网络流量定向到指定代理节点。
本项目适合以下场景:
- 只希望某些应用走代理,而不是整个系统都走代理
- 需要对桌面程序进行按进程分流
- 希望可视化管理代理节点、进程列表、流量和日志
- 希望基于
sing-box实现本地 TUN + 规则路由的桌面化封装
- 按进程代理
- 仅将选中的进程路由到代理
- 非目标流量默认直连
- 子进程自动跟踪
- 监控主进程后,会自动识别并处理其子进程
- 多种添加进程方式
- 手动输入进程名
- 选择
.exe文件 - 准星拖拽捕获窗口对应进程
- 多协议代理节点支持
- Socks5
- HTTP
- Shadowsocks
- VMess
- VLESS
- Trojan
- Hysteria2
- 节点导入能力
- 支持单条或多条分享链接导入
- 支持通过订阅 URL 拉取并解析节点
- 节点延迟测试
- 支持单节点测试
- 支持全部节点批量测试
- 日志与流量监控
- 查看
sing-box输出日志 - 实时显示总上传 / 总下载
- 显示各目标进程的发送 / 接收流量
- 查看
- 设置项支持
- 开机自启
- 反检测开关
- 随机窗口标题
- 随机 TUN 子网
- 随机 API 端口
- DNS 泄漏保护
- 桌面体验优化
- 托盘驻留
- 最小化隐藏到系统托盘
- 托盘菜单可快速启停代理与退出程序
ProcessProxy 的定位是一个 Windows 本地桌面进程代理前端。
它负责:
- 管理代理节点
- 管理需要走代理的目标进程
- 生成
sing-box配置 - 启动 / 重载 / 停止
sing-box - 展示日志与流量数据
- 持久化保存节点、进程和基础配置
它不负责:
- 提供代理服务端
- 实现代理协议本身
- 做系统级全局 VPN 管理界面
- 替代
sing-box核心能力
换句话说,这个项目本质上是:
一个将
sing-box、WPF UI、进程监控、节点管理、规则生成整合在一起的桌面工具。
- .NET 8
- WPF
- CommunityToolkit.Mvvm
- HandyControl
- Microsoft.EntityFrameworkCore.Sqlite
- Microsoft.Extensions.DependencyInjection
- System.Management
- 用于基于 WMI 监听进程启动 / 退出
- Windows Forms NotifyIcon
- 用于系统托盘图标与菜单
- user32.dll
- 用于通过屏幕坐标捕获窗口对应进程
- sing-box
- 项目通过外部进程方式启动
driver/sing-box.exe - 使用 TUN 入站、DNS 规则、进程名路由和 Clash API 统计接口
- 项目通过外部进程方式启动
- 程序启动后初始化依赖注入容器
- 从 SQLite 数据库加载代理节点与已保存的进程条目
- 用户选择代理节点,并添加要代理的目标进程
- 启用代理时,程序根据当前节点与进程列表生成
sing-box-config.json - 启动
sing-box.exe并加载该配置 - 通过定时器周期读取
sing-box提供的流量与连接信息 - 当被监控进程或子进程变化时,自动触发配置重载
当前配置生成逻辑具有以下特点:
- 启用
tun入站 - 对 DNS 请求执行
hijack-dns ProcessProxy.exe与sing-box.exe自身强制直连- 被选中的进程名通过
proxy出站转发 - 私网 IP 走
direct - 其余流量最终走
direct
这意味着:
- 只有你显式加入列表的目标进程会走代理
- 程序本身和
sing-box不会被自己的规则再次代理 - 这不是系统全局代理模式
- Socks5
- HTTP
- Shadowsocks
- VMess
- VLESS
- Trojan
- Hysteria2
当前分享链接解析器支持以下协议:
ss://vmess://vless://trojan://hy2://hysteria2://socks5://socks://
- 支持输入
http://或https://订阅地址 - 程序会先拉取远程内容
- 优先尝试 Base64 解码
- 然后按多行分享链接进行解析
http:///https://形式的内容在导入逻辑中默认被识别为订阅地址,而不是 HTTP 代理分享链接- 节点延迟测试使用的是 TCP 连接耗时,并不是完整代理握手后的真实性能测试
支持三种方式添加代理目标进程:
- 按进程名添加
- 例如输入
chrome,内部会规范化为chrome.exe
- 例如输入
- 按文件选择添加
- 通过文件选择器选择一个
.exe
- 通过文件选择器选择一个
- 准星拖拽捕获
- 拖动准星到目标窗口上,自动识别该窗口所属进程
进程条目会显示:
- PID
- 进程名
- 窗口标题
- 代理状态
- 发送流量
- 接收流量
- 主进程 / 子进程标识
程序会通过 WMI 监听进程启动与退出事件。
当你监控某个主进程后:
- 新启动的子进程会自动识别
- 子进程会自动加入列表
- 若当前代理已开启,会触发
sing-box重载,使新子进程也立即受代理规则影响
可以在节点管理窗口中执行:
- 新增节点
- 编辑节点
- 删除节点
- 导入分享链接或订阅
- 单个节点延迟测试
- 全部节点延迟测试
设置窗口支持以下选项:
- 开机自启
- 写入
HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
- 写入
- 反检测总开关
- 随机窗口标题
- 随机 TUN 子网
- 随机 API 端口
- DNS 泄漏保护
需要注意的是:
- 随机窗口标题、随机 TUN 子网、随机 API 端口、DNS 泄漏保护在代码中都受 反检测总开关 控制
- 如果未开启反检测总开关,即使子选项为启用状态,也不会真正应用
- 主界面底部可打开日志窗口
- 日志窗口会周期性刷新
sing-box输出 - 程序最小化后会隐藏到系统托盘
- 托盘菜单支持:
- 显示主窗口
- 启用 / 停用代理
- 退出程序
ProcessProxy/
├─ App.xaml # WPF 应用资源入口
├─ App.xaml.cs # 应用启动与依赖注入注册
├─ MainWindow.xaml # 主窗口界面
├─ MainWindow.xaml.cs # 主窗口交互、托盘、窗口行为
├─ ProcessProxy.csproj # 项目文件
├─ AssemblyInfo.cs # WPF 主题资源配置
├─ Controls/
│ ├─ CrosshairControl.xaml # 准星控件界面
│ └─ CrosshairControl.xaml.cs # 准星捕获逻辑
├─ Data/
│ └─ AppDbContext.cs # EF Core Sqlite 上下文
├─ Helpers/
│ ├─ NullToVisibilityConverter.cs # 绑定转换器
│ └─ TrafficFormatter.cs # 流量格式化工具
├─ Models/
│ ├─ AppSetting.cs # 应用设置实体
│ ├─ ProcessEntry.cs # 持久化进程条目实体
│ ├─ ProcessItem.cs # 主界面进程项模型
│ ├─ ProxyInfo.cs # 代理节点实体
│ └─ ProxyType.cs # 代理类型枚举
├─ Services/
│ ├─ AntiDetectionService.cs # 反检测辅助逻辑
│ ├─ AppConfigService.cs # config.json 读写
│ ├─ AutoStartService.cs # 开机自启注册表操作
│ ├─ LatencyTestService.cs # TCP 延迟测试
│ ├─ ProcessService.cs # 进程捕获、WMI 监听、子进程追踪
│ ├─ ProxyRepository.cs # 数据访问封装
│ ├─ ShareLinkParser.cs # 分享链接解析器
│ ├─ SingBoxConfig.cs # sing-box 配置生成器
│ ├─ SingBoxService.cs # sing-box 生命周期管理与 API 通信
│ └─ SubscriptionService.cs # 订阅拉取与解析
├─ ViewModels/
│ ├─ LogViewModel.cs # 日志窗口 VM
│ ├─ MainViewModel.cs # 主界面核心业务 VM
│ ├─ ProxyInfoViewModel.cs # 代理节点 VM
│ ├─ ProxyManageViewModel.cs # 节点管理 VM
│ └─ SettingsViewModel.cs # 设置窗口 VM
├─ Views/
│ ├─ InputDialog.xaml # 输入弹窗
│ ├─ LogWindow.xaml # 日志窗口
│ ├─ ProxyManageWindow.xaml # 节点管理窗口
│ └─ SettingsWindow.xaml # 设置窗口
└─ driver/
└─ sing-box.exe # 代理核心可执行文件
App.xaml.cs 负责注册以下核心服务:
AppDbContextProxyRepositorySingBoxServiceProcessServiceAppConfigServiceMainViewModelMainWindow
项目使用 Microsoft.Extensions.DependencyInjection 做简单的桌面应用依赖注入。
MainViewModel- 主界面核心协调者
- 负责进程列表、代理状态、流量、日志联动
ProxyManageViewModel- 节点管理、导入、测试延迟
SettingsViewModel- 应用设置读写
LogViewModel- 日志缓冲与 UI 刷新
ProcessService- 进程识别、WMI 监听、子进程追踪
SingBoxService- 负责外部进程启动、停止、重载、流量与连接数据读取
SingBoxConfig- 根据节点和进程列表生成配置 JSON
ProxyRepository- 封装数据库持久化
SubscriptionService/ShareLinkParser- 负责订阅与节点导入
SQLite 数据库在运行时自动创建,包含以下表:
Proxies- 保存代理节点
ProcessEntries- 保存用户添加的进程名条目
AppSettings- 保存例如
SelectedProxyId这类简单键值配置
- 保存例如
- Windows 10 或 Windows 11
- .NET 8 SDK
- 可用的
sing-box.exe
- Visual Studio 2022 或 JetBrains Rider
- x64 环境运行
- 以管理员权限运行程序(尤其是在 TUN 无法正常工作时)
本项目使用 sing-box 的 tun 入站能力。
在实际 Windows 环境中,TUN/路由相关能力通常对权限较敏感,因此:
- 如果你发现代理无法启用
- 或
sing-box无法成功创建 TUN / 路由 - 或流量没有进入规则
请优先尝试:
- 以管理员身份运行程序
当前项目中没有显式的管理员清单文件强制提权,因此是否需要管理员权限取决于实际系统环境与 sing-box 行为。
git clone <your-repo-url>dotnet restoredotnet build -c Releasedotnet run如果你想生成发布目录,可以使用:
dotnet publish -c Release -r win-x64 --self-contained false如果你计划把程序直接分发给其他人,请确认发布目录中包含
driver/sing-box.exe。
- 打开程序
- 点击 管理 打开节点管理窗口
- 手动添加节点,或导入分享链接 / 订阅
- 在主界面选择一个代理节点
- 添加要代理的目标进程
- 打开 启用代理 开关
- 观察主界面状态栏、日志窗口和各进程流量数据
你可以在节点管理窗口中输入:
- 一条分享链接
- 多条换行分隔的分享链接
- 一个订阅 URL
支持以下方式:
- 直接输入进程名,例如:
chrome - 选择目标
.exe - 将准星拖到目标窗口上
- 程序会扫描当前主进程的子进程树
- 生成新的
sing-box-config.json - 启动
sing-box.exe - 启动 1 秒定时器刷新流量信息
- 如果进程列表发生变化,会自动重载代理配置
- 停止
sing-box - 清空当前代理状态标记
- 停止流量刷新
- 状态栏更新为“代理已停用”
这些文件位于程序运行目录(即 AppDomain.CurrentDomain.BaseDirectory),通常是:
- 调试运行时:
bin/Debug/net8.0-windows/ - 发布运行时:发布输出目录
用于保存用户设置:
AutoStartAntiDetectionRandomWindowTitleRandomTunSubnetRandomApiPortDnsLeakProtection
SQLite 数据库,用于保存:
- 代理节点
- 进程条目
- 应用内部键值设置
运行时生成的 sing-box 配置文件。
它不是手写维护文件,而是由程序根据:
- 当前选中的代理节点
- 当前需要代理的进程名
- 当前设置项
自动生成。
程序依赖的外部代理核心。
如果该文件不存在,程序将无法成功启动代理,并会在日志中输出类似“sing-box.exe 未找到”的信息。
托盘初始化时会优先尝试读取运行目录下的 app.ico。
- 如果存在,则使用该图标
- 如果不存在,则回退为系统默认应用图标
本项目不是直接维护固定的静态 sing-box 配置,而是通过 Services/SingBoxConfig.cs 动态生成。
logexperimental.clash_apidnsinbounds(TUN)outboundsroute
默认生成两个 DNS 服务器:
8.8.8.8,通过proxy转发223.5.5.5,本地直连
当启用 DNS 泄漏保护时:
finalDNS 服务器会指向dns-remote
否则:
finalDNS 服务器会指向dns-direct
当启用反检测并打开相应选项后:
- API 端口会随机化
- TUN 地址会随机化
- 主窗口标题会随机化
- 可选择让 DNS 默认优先走远端解析
另外,当启用随机 TUN / 随机 API 端口时,程序还会:
- 复制一份随机命名的
sing-box.exe - 使用该随机文件名启动
- 停止时删除该临时副本
如果你准备将本项目公开到 Git 仓库,建议重点检查以下内容:
建议不要提交包含你个人代理节点信息的运行时文件,例如:
processproxy.dbconfig.jsonsing-box-config.json- 发布目录中的运行产物
虽然当前 .gitignore 已忽略常见 bin/、obj/ 等目录,但你仍应确认本地是否还有额外私有数据文件未被提交。
当前仓库中存在:
driver/sing-box.exe
如果你打算公开仓库或分发发行版,请你自行确认:
- 是否允许直接随仓库分发该二进制
- 是否需要在仓库中补充第三方许可证说明
- 是否更适合在 README 中说明“用户自行放入
driver/sing-box.exe”
当前项目根目录中未发现现成的 LICENSE 文件。
如果要公开发布,建议补充合适的开源许可证,例如:
- MIT
- Apache-2.0
- GPL-3.0
具体选择取决于你的开源策略以及第三方依赖的兼容性要求。
为了让公开仓库更完整,建议后续再补充:
- 软件截图
- 版本发布记录
- 许可证文件
- 常见问题(FAQ)
- 已知问题与路线图
- 仅支持 Windows
- 依赖
sing-box.exe外部可执行文件 - TUN 模式在部分环境下可能需要管理员权限
- 当前没有内置自动更新、安装器或服务化部署逻辑
- 延迟测试仅为 TCP 连接耗时,不代表真实代理吞吐或完整握手性能
- HTTP/HTTPS 形式的文本导入主要作为订阅地址处理,不是完整的 HTTP 节点分享链接解析方案
- 当前未看到自动化测试工程,项目主要以桌面应用逻辑为主
如果你后续准备继续完善项目,比较自然的扩展方向包括:
- 增加更多协议 / 传输配置项
- 增加节点分组、标签、搜索与排序
- 增加系统代理联动或 PAC 支持
- 增加导出 / 导入本地配置文件
- 增加日志级别切换
- 增加发布脚本与安装包
- 增加自动检测
sing-box版本与更新能力 - 增加截图、文档站点和 GitHub Release 流程
项目当前直接引用的 NuGet 包包括:
CommunityToolkit.Mvvm8.4.0HandyControl3.5.1Microsoft.EntityFrameworkCore.Sqlite8.0.13Microsoft.Extensions.DependencyInjection10.0.5System.Management10.0.5
此外还引用:
Microsoft.WindowsDesktop.App.WindowsForms
这个项目比较适合以下开发者或使用者:
- 需要做 Windows 桌面按进程分流的人
- 希望将
sing-box能力封装为 GUI 工具的人 - 想学习 WPF + MVVM + DI + SQLite + 外部进程协作方式的人
- 想做一个可视化的本地代理前端的人
本项目基于以下生态能力构建:
感谢这些项目提供的基础能力。
本 README 基于当前仓库代码结构与实现整理而成,内容尽量与现有实现保持一致。
如果后续你继续扩展:
- UI
- 配置项
- 协议支持
- 发布方式
- 存储结构
建议同步更新本 README,以保证公开仓库的可读性与可维护性。