Files
Gateway-keepaliveForDotnet/README.md
T
chuzhongzai 7be117057a 重做设置界面并修复登录自启:页签单选、滚轮归属、任务缺失判定、发布去掉自带运行时
设置窗口
- 改为独立非模态窗口(进任务栏、可最小化),不再被托盘浮窗挡住导致点不到
- 位置改为按屏幕可用区域居中裁剪,不再默认落在右下角
- 三个页签重构为卡片式布局:统一卡片内边距、页签行独立成行、正文左右留白、
  帮助文字按实际换行测量高度、标题栏与底栏加分隔线
- 直连 DNS 复选框、下拉框、滚动条改为自绘控件,配色与整体统一

页签
- PanelChip 的选中/强调改为值变化即重绘,修掉“切换页签后旧页签仍显示为激活、
  鼠标移上去才更新”的陈旧绘制

滚轮
- 输入框滚不动自己时把滚轮交给外层页面,单行输入框不再吞掉滚轮事件

登录自启
- 改用任务 XML + schtasks 写入,COM 失败时用 schtasks 复核;写入后读回校验
- 任务不存在按 HRESULT 判定(0x80070002 / 0x80070003 / 0x8004130F),修掉
  “关闭登录自启必定报错并回滚”(晚绑定 COM 抛的是 FileNotFoundException)
- 状态读取 COM 失败时回退到 schtasks,失败按异常类型 + HResult 去重记录

诊断
- 界面报错统一写日志;控制器记录自启读写结果;启动自检记录管理员/自启/进程/参数

发布
- 去掉 -SelfContained 分支,只保留单文件运行时依赖包,脚本与文档同步
- 新增 tools/unblock-publish.ps1,清除发布产物的网络来源标记

测试
- 新增登录自启任务 XML 用例与“任务缺失按 HRESULT 判定”回归测试(46 → 47),探测 16/16
2026-10-24 01:32:03 +08:00

5.3 KiB
Raw Permalink Blame History

网关保活 · .NET 托盘版

Windows 上的主路由 / 旁路由保活工具。旁路由连续检测失败时回退直连,稳定恢复后切回旁路由;也可以固定模式或暂停自动切换。

基于 PowerShell 原项目 重写,使用 C#、.NET 10、WinForms。托盘交互参考相邻的雷蛇鼠标控制器项目。完整设计见 PLAN.md。

当前版本

这是 0.1.0 初版,包含托盘面板、中文设置、分层探测、自动策略、可补偿的路由/DNS切换、快照恢复、日志与最高权限登录任务。

默认未配置且暂停。首次运行必须显式选择网卡并保存,程序不会按网卡名字猜测并立即修改网络。只管理选择网卡的 IPv4 默认路径;IPv6、VPN 路由和其他网卡不接管。

主面板

故障回退到主路由 首次未配置
故障回退 未配置

设置分为连接、保活规则、检测与提醒三页,默认只展示当前页需要的选项。

连接 保活规则 检测与提醒
连接设置 保活规则 检测与提醒

运行

使用 Windows x64 与 .NET 10 Desktop Runtime(需自行安装;发布只提供依赖运行时版)。托盘模式会请求管理员权限;只读诊断和预览不提权。

首次运行会看到两次系统提示,都是 Windows 自己弹的,不是程序重复启动:

  1. “未知发布者 / 安全警告”:exe 没有代码签名。点“运行”即可;想少一次提示可以先跑 .\tools\unblock-publish.ps1 去掉“来自网络”标记,或者给 exe 做代码签名。
  2. 用户账户控制(UAC):改路由和 DNS 需要管理员权限。拒绝提权后就无法切换网络。

手动启动时一定会弹出面板(登录任务用 --minimized 启动,只驻留托盘),不会再让人以为程序没启动而反复双击。

  • 左键图标:显示/隐藏面板;Esc 或点外部:收起面板。
  • 自动:按连续阈值和冷却切换;直连/旁路由:固定模式,失败时提示。
  • 暂停:继续监测,停止自动改网络。
  • 恢复:恢复接管前快照并暂停。存在未完成切换时,先处理那次切换的恢复。
  • 默认退出保留当前网络;“退出时恢复”可在设置中开启。
  • 设置是独立窗口:在任务栏有按钮,居中打开不会被托盘浮窗挡住;设置开着时点“退出程序”,会先关掉设置再继续退出。
  • 登录后启动:创建当前用户的交互式最高权限计划任务(schtasks 写入任务 XML,失败回退任务计划 COM,两条路径都读回校验)。程序换了位置后,下次以管理员身份启动会自动把任务改写为新路径,并写日志。

首次设置的示例网关为 192.168.6.1 / 192.168.6.2,SOCKS5 端口为 1070,请按实际网络调整。旁路由探测默认使用 www.google.com;直连探测另用 www.baidu.com、www.microsoft.com,避免直连无法访问代理目标导致错误回滚。默认各要求至少一个目标成功。

构建与测试

安装 .NET 10 SDK 后运行:

.\build.ps1 -Test
.\build.ps1 -Test -Publish

脚本优先使用 $env:GATEWAY_DOTNET、$env:USERPROFILE\.dotnet-sdk\dotnet.exe,其次使用 PATH 中的 dotnet。产物在 artifacts/publish/,编译与测试不会修改系统网络。

测试不依赖外部 NuGet 包,采用有退出码的控制台测试集,覆盖状态机、故障补偿、外部修改保护、持久化、SOCKS5 分片和 DNS 报文边界;不是用 dotnet test 运行。当前结果见 验证记录。

只读诊断

发布目录的 diagnostics/GatewayKeepalive.Cli.exe 不修改网络,也不创建自启任务:

.\GatewayKeepalive.Cli.exe --diagnose --output report.json
.\GatewayKeepalive.Cli.exe --probe --adapter <网卡GUID>
.\GatewayKeepalive.Cli.exe --dry-run --adapter <网卡GUID> --proxy
.\GatewayKeepalive.Cli.exe --dry-run --adapter <网卡GUID> --direct

--config 路径 指定 JSON 配置;--probe 会发送 DNS / SOCKS5 / TLS 网络请求,仍不会改网关。--dry-run 只生成计划。托盘 exe 也支持上述参数与 --preview 目录。

数据与恢复

数据位于 %LocalAppData%\GatewayKeepalive\:settings.json、session.json、switch-journal.json、logs/。JSON 采用临时文件写入、刷新落盘与替换,保留上一版 .bak。日志保留 14 天。

路由与 DNS 没有系统级跨操作原子事务。程序写前保存记录,分步写入、读回验证并探测真实 IPv4 TLS 出口;失败时补偿。发现外部修改、陌生网络或补偿失败会停止自动写入。进程被强行终止后,需要下次启动识别未完成记录再恢复;没有独立后台服务替已退出的进程实时修复网络。

接管范围与手动恢复步骤见 网络行为说明。界面截图在 artifacts/preview/(./build.ps1 后运行托盘程序 --preview <目录> 可重新生成)。