全部版本 v1.01 – v1.23 长期保留,均可免费下载。
相对 v1.22:交付形态升级为单一「智能外壳」——一次双击同时解决启动引导与主程序更新;数据文件夹跟启动入口走;进度显示透明化;安装失败诊断可操作化。
相对 v1.21:无新增功能。本版收录全量代码审查修复(安全默认收紧、文案与真实行为对齐、高危操作补确认弹窗)、一批清理/软件/系统工具行为修正与性能优化,以及 WebP 背景不生效与还原点创建失败两处用户反馈修复。行为变化集中在清理/优化/安全/激活类操作更保守、更如实。
相对 v1.20:无新增功能;本版为版本晋升,将 v1.20 之后补入的加固与打磨(路径定位、日志、布局、文件夹说明)并入正式基线。
相对 v1.19:数据目录合并为单一 cpq-tool 根目录;全驱清理增加运行时目录保护;Office 部署全卸/版本选项修复;AppX 与对话框打磨。
相对 v1.18 的源码变更(1 提交,1 文件,+43 / −18 行):配置管理页新增源码导出与 ZIP 下载、下载改用 ZIP;修复 Geek Uninstaller 下载卡死、优化便携版安装路径、改用 ZIP 加速下载;并规范 Release 资产(禁止上传 src.zip)。
net48 升级为 net10.0-windows,UI 框架保持 WPF 不变;显式 x64;System.Management / System.ServiceProcess.ServiceController 依赖升级至 10.0.0,WebView2 固定 1.0.2045.28。发布形态改为框架依赖单文件 exe(PublishSingleFile,约 6.5 MB)。
src.zip 作为嵌入资源,exe 体积多出约 960 KB,且 MSBuild 不会随源码变化自动重打包,导出的常是过时快照。新方案由 csproj 的 GenerateSourcePackage 目标在每次构建(BeforeBuild)从当前源码自动重打包并内嵌 CpqSystemTool.srcpkg.zip(约 0.82 MB),导出内容永远与本次构建一致;两张背景图刻意不入包(导出时经 CpqExtractBackgroundsFromAssembly 从运行中的程序集取回,导出结果完整可编译),WebView2 依赖 DLL 亦排除。文件夹发布另有 CopySourceDisclosure 目标把源码目录原样复制到发布目录 src\CpqSystemTool;运行时导出优先解包内嵌源,缺失时回退复制目录(MainWindow.Config.cs)。
DeleteSubKeyTree("", false) 传入空子键名会在无此键时抛 ArgumentException,且本方法无 try/catch,异常会中断后续两条 SetEdgePolicy 策略写入(禁止更新可能不生效)。改为 RegistryHelper.DeleteKeyTree(内部 try/catch + 64/32 双视图 + 删后二次校验),保证策略写入一定执行,失败仅记日志。
PickSetupExe 优先匹配文件名含 setup/install 者,其次按 Id/Name 匹配,兜底才回退首个候选,避免装错程序。
outp.Contains("1") 在 cscript /dstatusall 多行输出中任何行含 "1" 即误判为已激活。改为 outp.Trim() == "1",仅当状态值恰为 "1" 才判定已激活,消除误报。
Exec.RunCmd(new[] { "slmgr.vbs", "/rilc" }, log, capture: true) 真实重装系统许可证、检查返回码,并在失败时给出密钥后 5 位提示与 HWID 回退建议。
RunInBg 固定"完成"文案,无论实际删除成功/失败/未找到 probes 都显示完成,掩盖真实结果。从 cpq 移植 RunInBgWithStatus,按删除计数 / probes 是否存在动态给出「卸载完成 / 卸载未完成:N 项删除失败 / 未找到 probes 目录 / 无可卸载内容」状态。
catch {} / catch (Exception) {} 静默吞掉异常,改为 catch (Exception ex) { DebugLog.Ignore(ex); },把异常记录到 DebugLog 便于事后排查(脏数据 / 路径异常不再无从追查);WebView2 注入的 JavaScript 字符串内 catch (e) {} 保持原样(非 C# 代码,不应改动)。同步修复一处变量名冲突(CS0136)与 BOM 双重编码回归。
相对 v1.17 的源码变更(基线 commit 1ab18c3 + 本轮 CHANGELOG 补充):运行平台由 .NET Framework 4.8 迁移至 .NET 10(UI 框架仍为 WPF),「导出源码」改为构建期自动打包;补齐 5 处已知缺陷(N1/A3/A4/A8/N2),并治理全项目 61 处空catch {}/catch (Exception) {}静默吞异常(改为DebugLog.Ignore(ex)记录日志,便于排查)。
SoftwareInstall.cs 新增 ReadTimeoutMs / DownloadTimeout 可配置字段,Geek 配置总超时 900s + 读空闲 120s,应对极慢速服务器(~12 KB/s)反复超时失败。
%LOCALAPPDATA%\CpqSystemTool\Portable\{id}\ 改为桌面根目录,打开即可见;同步更新 KnownExePaths 检测路径。
src.zip 为内嵌资源(供「导出源码」使用),不是 Release 资产;Release 仅上传 exe + README.md。
相对 v1.16.1 的源码变更(15 个提交,73 个文件,+8163 / −1913 行):背景编辑器大规模迭代(HSV 色轮性能优化、颜色格式显示、对比度检查、网格光斑拖拽)、配置管理页重构(导出源码功能)、探针工程重构(独立 HttpClient、TLS 1.2/1.3、UA 池轮换)、App.xaml 异常处理前置、src.zip 防呆机制。
RenderColorWheel,用 BeginInvoke + 标志位把多次请求压缩成一次真实渲染;明度变化才重算像素,拖色轮改色相/饱和度时只需移动指示器。
_blobHandles 字典映射预览区光斑句柄,支持拖拽移动光斑位置;每模式最近一次的几何参数存回旧 mode、切回时从字典读回,避免 Linear 90° 切 Radial 后 90° 丢失。
_angleByMode / _centerXByMode / _centerYByMode 三个字典,模式切换时把当前值存回旧 mode、切回时从字典读回。
#RGB / #RRGGBB / #RRGGBBAA 三种格式,'#' 可省略;防止中间态输入被误解析。
ProbeSiteFastAsync 由共享静态 HttpClient 改为每次调用创建独立实例(using var client = new HttpClient(handler)),彻底解决间歇性 TaskCanceledException。
ServicePointManager.SecurityProtocol |= Tls12 | Tls13,.NET Framework 4.8 默认仅 TLS 1.0/1.1,现代 HTTPS 服务器握手失败误报为"无法连接"。
geekuninstaller.com → geek.exe)。
PackageUrlRe 正则匹配 .zip/.7z/.rar,通用修复下载页直链提取问题。
StartupUri="MainWindow.xaml",改由 App.xaml.cs 的 OnStartup 手动创建并显示主窗口;DispatcherUnhandledException handler 挂载在 base.OnStartup(e) 之前,保证构造期异常能被捕获并写 crash.log。
OnExit 覆写,显式调用 ReleaseSingleInstanceMutex() 释放并销毁 Mutex,避免异常退出/热重启场景下互斥量残留导致新实例误判为"已有实例"。
#RGBA 4 位格式展开顺序错误(原注释说 ARGB 但实际展开为 RRGGBBAA,与 CSS #RRGGBBAA 8 位分支的读取顺序不一致);Offset 越界钳制到 [0,1],避免 new GradientStop(...) 抛 ArgumentException。
catch { } 静默吞掉一切异常,脏 JSON 只表现为「设置莫名回到默认值」且无从排查;改为 Debug.WriteLine 输出带上下文的诊断信息。
src.zip,解压到 系统清理与优化工具_源码 文件夹。
bgCard 和 logClip 都加 ClipToBounds = true,防止最大化时子内容溢出 + 缩小时残留大尺寸渲染缓存。
CpqSystemTool.csproj 新增 MSBuild 任务 CheckSrcZipFreshness,构建前比对 src.zip 与最新源文件的时间戳;过期则报 warning,借本项目「交付构建必须 0 warning」的门禁,强制在构建前先重生成 src.zip。
ThemeBrush(Color c) 私有方法,创建后调用 Freeze(),避免 WPF 为维护 Freezable 变更订阅/失效传播带来的额外开销。
Accept-Encoding: gzip, deflate(手动解压);固定 UA → 5 条 UA 池轮换;补 Accept-Language 与同源 Referer。
Classify 方法中的正则提为静态只读(ReExe/ReX64/ReNoX64/ReArm64/ReX86/Denylist),避免每次调用都重新构造 + JIT 编译。
UiShapes.MakeChevron 共享。
Exec.RunPowerShell/RunPowerShellGet(底层 -EncodedCommand Base64 Unicode),消除引号/中文路径乱码与命令注入风险。
site-src/version.json 为唯一真源,render_site.py 渲染生成 site-dist/;改后 validate_html.py 四页全 OK 再部署。
site-css/style.css 归入版本控制,不再是 gitignore 状态。
no-store → no-cache → max-age=300 调优,确保部署后立即可见;.worker.js 图片资源补充 Content-Type 映射(png/ico/svg/jpg/gif/webp)。
Grid Star 平均分配全部可用空间,标准窗口(740 高)下 16 项正好占满、无底部空白、无滚动条;矮窗口自动出现细滚动条兜底。
RegistryHelper.EdgePolicyHives(HKCU + HKLM 统一操作),仅清 HKLM 会因 HKCU 残留而清不掉「由组织管理」状态。
swinst_ 临时目录路径直接拼接用户输入,恶意 ..\ 可逃逸 %TEMP%;修复:输入层校验 ID 仅允许 [A-Za-z0-9_-](长度 1-64),使用 SanitizeSwId 防御性清洗。
_cacheRealtime 等 6 个静态缓存字段后台线程写、UI 线程读;修复:全部 volatile + _cacheLock 整体包住刷新/读取。
powershell.exe + -EncodedCommand,消除 PATH 劫持风险;Chocolatey OData 过滤的 id 加白名单校验;Office 部署 XML 中 pid/channel 用 SecurityElement.Escape 转义。
.bak_pagecache_* / site-css / site-js / .bak_*)。
.bak* 备份、.log 日志、.bak_* 临时目录。
相对 v1.15 的源码变更:Edge 管理页新增「实验性功能 flags」批量管理(11 项推荐配置 + 一键优化/恢复 + 强制重启生效)。
HKCU\Software\Microsoft\Edge\EdgeFlags → 强制重启 Edge 立即生效。
%UserProfile% 改为当前已安装 exe 同级目录(AppContext.BaseDirectory)——覆盖更新(如 v1.14→v1.16)时下载文件默认落到旧版本旁边,不再跳到用户目录。
相对 v1.14 的源码变更:修复侧边栏「配置管理」在标准窗口下被截断的问题——按钮区改为 Grid Star 行均分 + ScrollViewer 滚动兜底。
Grid 16 行 Star 平均分配全部可用空间,标准窗口(740 高)下 16 项正好占满、无底部空白、无滚动条;窗口最大化时每项自动变高。
ScrollViewer(VerticalScrollBarVisibility=Auto),窗口被压缩(小屏 / 高 DPI 缩放)时出现细滚动条,全部导航项仍可达;标题 / 副标题固定顶部不随滚动。
相对 v1.13 的源码变更:第 6 轮深度审查驱动的安全/竞态/性能优化——封死自定义软件 ID 路径穿越、Defender 缓存跨线程同步,并把「整页缓存」铺开到 9 个高频页面(常用软件 / Appx 商店 / Appx 管理 / 系统优化 / 服务优化 / 安全防护 / 清理优化 / 内存工具 / 配置管理),附带日志行数上限与探针请求头优化。
swinst_ 临时目录路径直接拼接用户输入的软件 ID,恶意 ..\ 可逃逸 %TEMP% 以管理员权限写任意路径。修复:输入层校验 ID 仅允许 [A-Za-z0-9_-](长度 1-64),使用点 SanitizeSwId 防御性清洗后拼路径(临时目录 / 下载目标 / 清理枚举全覆盖)。
_cacheRealtime 等 6 个静态缓存字段后台线程写、UI 线程读,无同步可能读到半更新状态。修复:全部 volatile + _cacheLock 整体包住刷新/读取,顺带消除并发双 PowerShell 子进程。
Accept-Encoding: identity → gzip, deflate(手动解压);固定 UA → 5 条 Chrome/Edge UA 池轮换;补 Accept-Language 与同源 Referer,降低被 WAF/CDN 识别为 bot 的概率。
相对 v1.12 的源码变更:按「基础设计缺失扫描」结论整体补强——exe 自替换原子化、全局操作防重入、配置原子写入、危险操作确认、更新状态锁,并新增两处 UI 提醒。
.NET Framework 4.8 的 HttpWebRequest DNS 解析 IPv6 优先且失败不回退 IPv4,而 Cloudflare Pages 返回 AAAA 记录、本机无 IPv6 连通 → 直接超时"无法连接"(浏览器有 Happy Eyeballs 自动回退所以正常)。修复:DownloadStringWithProxyFallback 首选「手动解析 A 记录 → IP 直连 + Host 头保留域名(SNI/证书正确)」,系统代理 / Watt Toolkit 作回退;顺带每次显式升 TLS 1.2。
ApplyPendingBakeIfAny 由「先改名后替换」两步改为 MoveFileEx 原子替换(MOVEFILE_REPLACE_EXISTING|WRITE_THROUGH),占用时回退「改名+移入」并带失败回滚——中途失败不再让主程序停在 .old,自包含更新始终可用。
OperationLock 全局互斥,清理 / 优化 / 安全防护(Defender 禁用/恢复、开关、防火墙规则、更新管理)等耗时操作同一时间只允许一个——按钮连点或跨模块并发不再并行删同目录 / 并行写同注册表键;冲突时提示「已有XX操作正在运行」。
ConfigBackup.Save / Theme.SaveBackgroundSettings / SoftwareDefPersistence.StageBake 由 WriteAllText 直写改为「同目录 tmp + MoveFileEx 原子替换」——崩溃不再留半截 JSON 导致配置静默丢失。
_checkingUpdate / _downloadingUpdate 状态锁 + 按钮禁用联动——并发触发不再竞态写更新地址 / 重复弹下载框。
相对 v1.11 的源码变更:继续清理技术债——统一 4 套下载实现、封死后台线程 Dispatcher 关窗崩溃面、消除全部 sync-over-async(.Result),并修复「可多开窗口」的单实例缺失。
Helpers/Downloader.cs):此前 4 套重复的 HTTP 下载逻辑(About 代理回退下载 / AppxManager 断点续传 / WebView2ProbeDeps 进度下载 / OfficeInstall 过时 WebClient)合并为单一 Downloader.DownloadAsync——支持重试、进度回调、请求级超时(CTS)、代理回退、断点续传(Range)、UA 注入;后续修下载类 bug 只需改一处,行为一致。
Dispatcher.Invoke/BeginInvoke,其中 32 处后台线程调用(下载进度回调、Appx/软件页 ThreadPool 加载、Defender/防火墙状态刷新、还原点列表、内存分析、系统事件线程等)统一补 try { } catch { /* 窗口已关闭,忽略 */ }——后台任务运行中关闭窗口不再因 Dispatcher 关停抛未处理异常导致进程终止(延续 v1.11 的 RunInBg 修复,封死剩余面)。
.Result(sync-over-async):9 处阻塞等待全部改造——ChocolateyResolver 解析链、SoftwareInstall 下载/安装/页面解析链真 async 化(TryResolveAsync/DownloadAsync/ResolveAsync/InstallAsync),ProbeBrowserHost 已 await 完成取值改 GetAwaiter().GetResult();全项目 .Result 清零,消除死锁隐患。
相对 v1.10 的源码变更:三轮代码审查(结构 / 性能 / 缺陷)驱动的一次全面优化——修复 6 类真实缺陷、5 项性能提速、5 项结构与冗余重构。
RunPS/RunCmd/RunCmdGet/RunVbs/RunVbsGet 由顺序 ReadToEnd 改为异步并行排水(BeginOutputReadLine/BeginErrorReadLine),消除子进程 stderr 写满 64KB 管道缓冲导致的互相阻塞(此前最坏挂到 15 分钟超时被杀);capture 模式 stderr 不再静默丢弃(输出 [STDERR])。
MainWindow.RunInBg 与 DriverStorePanel.RunInBg 的 Dispatcher 调用统一加 safeUi 兜底——清理/下载/探针/驱动加载等长任务执行中关闭主窗口,不再因 net48 未处理后台线程异常导致进程直接终止。
UninstallString(如 C:\Program Files\X\un.exe /S)按「最长存在的文件前缀」解析,不再截断成 C:\Program 导致卸载失败。
where node 无超时挂死:ResolveNodeExe 的 WaitForExit() 加 10s 超时 + 强杀,安全软件拦截时后台线程不再永久挂死。
RefreshDepStatus / DownloadUpdate 改为 async Task + 外层兜底,消除 UI 线程崩溃面。
foreach + await → SemaphoreSlim(5) + Task.WhenAll(保序),多候选场景最坏 225s → 约 45s(5 倍提速)。
CheckWebView2ReadyAsync 30s TTL(成功/失败均缓存)+ 「管理依赖」重入锁,反复打开秒回。
MainWindow.Pages.cs 拆分:5,599 → 833 行,按功能域拆 8 个 partial(Tweaks/Appx/Software/About/Security/Config/Cleanup/SystemTools)+ 2 个独立类(StoreSearchWindow/BoolToBrushConverter)。
DebugLog.Ignore(ex)。
VersionUtil)、MiniJson 双实现合一(MiniJson)、3 处版本名映射字典合一(EditionMap,单一数据源双向查询)。
BaseDirectory\Config 硬编码 → AppPaths.ConfigDir。
new HttpClient → 共享单例,消除 socket TIME_WAIT 堆积;请求级超时(CTS)与 UA/Referer 注入,探针专用单例保留。
相对 v1.09 的源码变更:新增「内存工具」导航页(镜像 RAMMap 只读视图 + 可选内存优化),置于「系统工具」之下。
GlobalMemoryStatusEx + GetPerformanceInfo(均为 Windows 文档化 API)展示总/可用物理内存、内存占用百分比、已提交/提交上限、内核分页/非分页池。
WMI Win32_PerfFormattedData_PerfOS_Memory(文档化计数器)把物理内存拆为「使用中 / 备用 / 已修改 / 空闲+零页」四类占比条 + 图例(含字节数与百分数);并展示可用/系统缓存/已提交/提交上限/分页池/非分页池明细,下方列出进程工作集 Top 10(GetProcessMemoryInfo + EnumProcesses)。
Expander 默认折叠,仅供管理员启用;提供「清空备用列表(Standby)」「清空所有进程工作集」两项——前者调 NtSetSystemInformation(MemoryPurgeStandbyList=2) 清 Standby,后者逐进程 EmptyWorkingSet;均带 SeProfileSingleProcessPrivilege 提权与风险说明(优化为临时效果,用缓存/工作集换即时空闲内存)。
Modules/MemoryAnalyzer.cs:封装全部 P/Invoke(kernel32/psapi/ntdll)与 WMI 查询逻辑,全程 try/catch 优雅降级(WMI 不可用时拆解数据单独提示不可用,总览数据仍可用)。
NtQuerySystemInformation(0x32) 未文档化结构体偏移猜错导致静默假数据的风险;仅优化层(Standby 清理)使用经验证权威常量 MemoryPurgeStandbyList=2(网上部分资料误写为 3/4)。
WrapPanel 改为 2 行 × 3 列网格,占满页面宽度(不再随窗口宽度换行错落)。
WMI Win32_PerfFormattedData_PerfOS_Memory 首次查询常返回全 0(计数器尚未「cook」),GetUseCounts 增加一次重试(+80ms);新增 四级回退链:WMI 格式化类 → 重试 → WMI 原始类(Win32_PerfRawData_PerfOS_Memory)→ PDH 性能计数器(pdh.dll PdhAddEnglishCounter 直接读 \Memory\* 计数器,绕过 WMI)→ 基于 GetOverview 的降级视图,确保 WMI 不可用时仍能拿到真实拆解数据、功能不整体失效;修复占比条闪一下即消失、拆解全显示 0 B 的问题;取数仍不可用时不再把占比条收缩为 0 宽度(改为整条灰色占位 + 文字提示),避免「消失」观感。
TryQueryUseCountsPdh 改为逐计数器容错——某计数器名在本 Windows 版本不存在(如旧版无 Standby 细分)时仅跳过该计数器、零值填充其余有效值,只要关键计数器「可用内存(Available)」成功即采用真实数据,不再因单个计数器缺失而丢弃其余 10 个有效值;全部读取失败时仍正确回退到降级视图。
GetUseCounts 的 catch 与「全部回退失败」路径统一置 IsDegraded = true,即使 overview == null 连降级视图都构造不出,也确保 UI 走「数据不可用」灰色占位 + 清晰提示,绝不把全 0 当成真实内存拆解渲染(占比条消失 / 明细显示 0 B)。
Modules/MemoryAnalyzer.cs 的 PDH 格式常量 PDH_FMT_LARGE 被误写成 0x00000200(该值实为 PDH_FMT_DOUBLE)。代码据此请求 DOUBLE 格式却又用 cv.longValue(64 位整数)读取,把 IEEE-754 double 的二进制位当成整数读 → 出现数十亿 GB 的假数据;进而「可用 + 已修改」远大于总物理内存,使「使用中 = 总 − 可用 − 已修改」被钳为 0。修复:补 PDH_FMT_DOUBLE = 0x00000200 并将 PDH_FMT_LARGE 改正为 0x00000400,fmt 现在真正请求 LARGE 格式、longValue 读取合法 → 「使用中」显示真实值、各项字节数回归正常量级。
RunInBg 调用补充第 4 参 onDoneUi = () => DoMemoryAnalyze(pb, applyUi),在后台优化完成后于 UI 线程自动重新抓取并刷新「内存使用拆解」视图,效果即时可见。
相对 v1.08 的源码变更:新增 Whesvc 诊断日志清理项与服务禁用项。
Whesvc 诊断日志 项(默认不勾选),清理 C:\Windows\Temp\DiagOutputDir\Whesvc 下 Windows 健康状况和优化体验服务生成本地性能追踪 ETL 日志。该日志可安全删除、服务重新启用时会再生;服务运行时文件被占用会自动跳过。
whesvc:在可禁用服务清单新增「Windows 健康状况和优化体验」,风险等级 mid,说明注明「本地性能诊断日志(占C盘),关掉无性能提升、笔记本可能影响节能」。
相对 v1.07 的源码变更:关于页新增官网地址链接,检查更新改为从官网 version.json 获取新版本,官网安装包统一改为中文名。
官网:cab.dpdns.org 链接,指向 https://cab.dpdns.org/。
tag_name,现改为读取官网根 version.json 的 version/name/url 字段,普通用户无需访问 GitHub、下载更快;版本比较与「下载更新」弹窗逻辑保持不变。
System-Cleanup-Optimizer_vX.XX.exe 改为 系统清理与优化工具_vX.XX.exe(v1.01 – v1.22),version.json 的 name/url 同步使用中文名;GitHub Release 资产保留英文名 System-Cleanup-Optimizer_v1.08.exe(规避 gh 中文文件名截断)。
相对 v1.06 的源码变更:完成全部下拉框(ComboBox)深/浅色主题统一与自定义下拉 Popup 层级修复,修复「安装到」按钮主题自适应。
Color.FromRgb(0xE6,0xF7,0xF4),深色模式下始终不变;现改为主题笔刷 _btnSecondaryBg + _accent 高亮文字/边框,与默认态均随深/浅色自动变换。
UiShapes.DisablePopupTopmost)。
UiShapes.ApplyComboBoxTheme,以自定义 ControlTemplate(闭合框 + 下拉弹层均引用主题键)+ ComboBoxItem 样式,让 7 个 ComboBox(版本切换目标 / Office 版本 / Edge 频道 / 驱动引擎 / 分组 / 软件分类 / 风险等级)的背景、字体、边框与下拉弹层(含选中/悬浮态)统一跟随深/浅色主题笔刷,替代默认跟随系统色的 Aero2 模板(深模式下弹层为刺眼白底);弹层刻意关闭 AllowsTransparency 以复用默认 ComboBox 的非置顶行为,避免重新引入浮层问题。
相对 v1.05 的源码变更:WebView2 浏览器探针依赖改为「运行时从 NuGet 拉取」兜底(摆脱 Costura 嵌入);全部实心箭头改为开放折线 chevron(抽出 UiShapes 共享);修复清理优化页分组 Expander 标题丢失与箭头错位;若干健壮性修复。
Modules/WebView2ProbeDeps.cs。单文件/裸 exe 分发到其他机器缺失 3 个托管 WebView2 DLL 时,运行时从 NuGet 拉取 Microsoft.Web.WebView2 1.0.2045.28(3 托管 + 原生 Loader)到 exe 目录;幂等(sentinel=Core.dll)、不抛异常(失败仅记录日志、探针随后回退 Node+Playwright)、后台下载不阻塞 UI。挂钩 EdgeCore 安装/修复、ProbeBrowserHost 初始化、RunProbeInternal 共 4 处。
Fill=Transparent + Stroke + 圆角线帽、无 Z);抽出 UiShapes.MakeChevron(真实 Path)与 ConfigureChevronFactory(ControlTemplate 工厂)消除 4 处重复;排序箭头方向语义纠正为「升=上、降=下」。
EdgeCore.RepairWebView2 安装器下载路径由桌面改为 AppDomain.CurrentDomain.BaseDirectory(exe 目录)。
MakeLineArrowExpander 未把 Expander.Header 绑到 HeaderSite.Content,导致模板内 ContentPresenter 无内容、标题整体空白;并修正 Grid 列序——箭头置于第 0 列(左侧、居中)、标题置于第 1 列(居左)。折叠时箭头仍朝右。
_initError 并以 TrySetResult(false) 完成,避免缺失 WebView2 程序集时进程崩溃(探针正常回退 Node 提示);新增 webview2_deps.log 诊断下载成败。
UiShapes.cs / WebView2ProbeDeps.cs 补全 UTF-8 BOM(项目硬性约定)。
AppendOrReplaceLog(原地百分比进度重写)、repositionDepsPopup(主窗口拖动时下拉跟随)等局部优化。
WebView2ProbeDeps.EnsureWebView2ProbeDeps 重构为 EnsureWebView2ProbeDepsAsync(真正异步、下载走线程池、可 await),ProbeBrowserHost.InitAsync 与 CheckWebView2ReadyAsync 改为直接 await,不再依赖「调用方用 Task.Run 包裹」的约定来避免 UI 冻结;保留同步兼容包装供后台线程(RunInBg)调用方使用,全程 ConfigureAwait(false) 无死锁风险。
UiShapes.MakeTextWithArrowGrid:消除「管理依赖」「全部分类」两处下拉按钮重复的「文字 + 右侧箭头」2 列 Grid 构造,统一由共享方法生成(布局与原先完全一致)。
相对 v1.04 的源码变更:新增「驱动清理」模块(参考 Driver Store Explorer / RAPR 界面与行为设计,基于 Windows 原生 API 独立实现)+ 多项交互与体验增强。
pnputil /enum-drivers 解析 OEM 驱动列表(供应商、类、版本、日期、发布名、原始 inf 名、占用空间)。
Win32_PnPSignedDriver 比对 InfName 映射,标记当前在用的驱动,默认不可删。
/force,仅删未在役的旧版 oem#.inf;删除前二次 MessageBox 确认(危险操作红色提示)。
Win32_PnPSignedDriver/Win32_PnPEntity 双键匹配;仍无匹配时自动用 Provider + ClassDescription 兜底,避免设备名列大量空白。
pnputil)与 DISM 系统映像双后端切换(DISM 含系统内置驱动);按类别 / 供应商分组;启动关键驱动默认保护(避免误删导致无法启动)。
%SystemRoot% 不被展开,改为 $env:SystemRoot。
---LICENSED---(兼容 cscript /dstatusall 输出左侧空格差异)。
MiniJsonParser 的 \u 转义越界保护,避免超长转义截断崩溃。
Get-ComputerRestorePoint 校验序号是否存在,避免无效序号静默谎报成功;引号处理统一改用 Exec.QuotePS。
Exec.QuotePS;EdgeCore 的 WebView2 卸载由 cmd 通配改为 C# 枚举版本目录、逐个 setup.exe --uninstall(修复通配被 cmd 忽略导致卸载静默 no-op)。
SetDacl 原生内存泄漏修复,所有 AllocHGlobal 在 finally 统一释放。
MapChineseToEnglish 死代码(中文键里搜英文子串恒为 false)改为 5 条直接回退(如「专业工作站」→ ProfessionalWorkstation)。
NavigateAndWaitAsync 增加 20s 超时,避免永久挂起。
depsDiag 与未用字段 _depOutsideClick(消除 CS0169 警告)。
_dangerDark。
SetupAPI / PnPUtil / DISM 的独立实现,仅界面列布局与行为设计受其启发。已将 README / NOTICE 措辞修正为「参考 / 独立实现」,并在 NOTICE 补充「第三方来源与致谢」(非隶属、非衍生声明)。本澄清不影响 Apache-2.0 许可合规性。
相对 v1.03 的源码变更:Edge 组策略双 hive 修复 + WYSIWYG 应用策略 + 清理降级 + 更新下载代理回退(详见 code-review 全量检查)。
Tweaks.cs 前 4 个 Edge 优化项(欢迎页/标签页性能检测/新标签页资讯/个性化广告)的 Disable 原误写成「设值 0/1」而非「删除策略值」,Edge 检测到有值即视为「由组织管理」而恢复不掉;改为 DeleteEdgePolicy 彻底删除。② ApplyChecked 原只对勾选项做启用、不处理取消勾选项,导致「取消勾选 + 开始优化」什么都不做;改为 WYSIWYG 全量纳入。
RegistryHelper 新增 EdgePolicyHives(HKCU + HKLM)辅助块(SetEdgePolicy / SetEdgePolicyRecommended / DeleteEdgePolicy / DeleteEdgePolicyRecommended / DeleteEdgePolicyTree / GetEdgePolicyState / GetEdgePolicyRecommendedState)。仅清 HKLM 会因 HKCU 残留而清不掉「由组织管理」状态,现统一双 hive 操作。EdgeCore 的 BlockEdgeUpdate / RestoreEdgeUpdate / SetStartupBoost / IsStartupBoostEnabled 同步迁移到双 hive。DeleteKeyTree 增加「键不存在即视为成功」前置判断,避免 HKCU 无 Edge 键时的误报 [!] 删键失败。
Modules/SystemInfo.cs 按 CurrentBuild 判断 Windows 代际(11/10/8.1/8/7),并将 EditionID 与 ProductName 中的版本片段映射为中文(如 ProfessionalWorkstation / Pro for Workstations → "专业工作站版");原英文 Build: 改为中文 版本号:。映射表已覆盖 Windows 10/11 全部主流版本(含 N / S(LTSC) / S 模式 / IoT 企业版 / 服务器 / 多会话),并按键长降序匹配避免短片段误命中。映射缺失时优雅降级为英文原文(EditionID 或 ProductName 去 "Windows X " 前缀后的片段),绝不报错。
Cleanup.cs 删除失败改用 Exec.RunPowerShellGetFull 捕获 stderr/exitCode;「文件正被另一进程使用」属预期(程序运行中),降级为安静 [SKIP] 提示,不再刷 [PS-ERR] 噪声;其余真实错误仍如实暴露。
vsTargetCombo 默认选中当前系统 EditionID,不再固定首项。
DownloadStringWithProxyFallback / DownloadFileWithProxyFallback 依次尝试 系统代理 → 直连 → 本地常见回环代理端口 三层自动回退;DownloadUpdate 改为 async/await 替代原 Task.Run + while(IsBusy) Sleep 忙等轮询。
vX.YY(历史 v1.01 / v1.02 / v1.03 均为两段;上一版误用三段式 v1.0.4 导致「检查更新」段位错位误报「已高于线上」)。同步 csproj(1.0.4.0,内部程序集版本保持不变)/ APP_VERSION(v1.04);交付文件名 系统清理与优化工具_v1.04.exe。CompareVersion 保留 NormalizeVersion 防御层(两段且第二段≤9 自动补 0),杜绝日后混用。
相对 v1.02 的源码变更:三遍代码审查发现项修复 + 代码清理(详见 code-fix-2026-08-11.md)。
powershell.exe + -EncodedCommand,消除 PATH 劫持风险;Chocolatey OData 过滤的 id 加白名单 ^[A-Za-z0-9.\-]+$ 校验;Office 部署 XML 中 pid/channel 用户值用 SecurityElement.Escape 转义;WebView2 引导程序与 Office 安装包下载加存在性与非空校验,避免对损坏文件静默执行。
catch{} 改为 Debug.WriteLine 可见日志,不再把检测异常误报为 Node 未安装;ProbeBrowserHost 同步异常路径经 TaskCompletionSource 传播,避免调用方 .GetAwaiter().GetResult() 永久挂起。
DialogChrome(新增 ShowError / BuildTitleBar),3 个 Dialog 复用,减少重复;删除 Theme.cs 冗余 Debug.WriteLine、死文档注释、冗余列宽赋值。
try{OpenSubKey...is int v} 模板收敛为 RegistryHelper.GetDwordState。
ScrollViewer 并限制最大高度,避免版本增多后卡片无限拉长。
browser_download_url 取得(避免本地拼中文资产名与线上实际英文名不一致导致 404);下载增加系统代理 → 直连 → 127.0.0.1:26561 三层自动回退,解决无代理环境下连接 GitHub CDN 失败的问题。
相对 v1.01 的源码变更面:14 个文件修改(+1093 / −667 行),新增 2 个源码模块与 1 个构建资源。
SetupCdp() 在 UI/STA 线程上同步阻塞等待 CDP 响应,而响应需经同一线程消息循环回派 → 永久死锁 → 超时。改为 async Task SetupCdpAsync() + await,端到端验证 SearchAsync("7-zip") 返回真实直链成功。
SKIP(非安装包 .js)与 404 死链。在 ProbeEngine.BuildRows 增加 SKIP / 404 过滤,列表只展示可用的真实 exe 直链。
powershell -Command 调用统一迁移到 Exec.RunPowerShell/RunPowerShellGet(底层 -EncodedCommand Base64 Unicode),消除引号/中文路径乱码与命令注入风险。
.gitignore 行内注释 bug:git 不支持行内注释(仅行首 # 生效),runtimes/ # 注释 整行被当模式导致规则失效;更严重的是 !src/CpqSystemTool/src.zip # 注释 取反失效会让构建必需的 src.zip 被 *.zip 错误忽略(克隆后报 CS1566)。改为独立 # 行后恢复正确忽略。
Modules/ProbeBrowserHost.cs(独立 STA 线程 + WinForms 承载 WebView2,复用系统 Edge Runtime,主动扫描 msedgewebview2.exe 绕过损坏注册表)与 Modules/ProbeEngine.cs(参考 official_exe_finder.js 的纯逻辑引擎,独立实现)。
MainWindow.Maint.cs,+363 行):Node + Playwright + Chromium 回退路径的安装 / 卸载与状态刷新;IsNodeDepsReady 收口为统一就绪判定。
APP_VERSION / 关于页更新日志 / README / build.bat)。
系统清理与优化工具_v1.02.exe(保留 AssemblyName=中文名,仅部署文件名带版本,避免资源 URI 连锁修改)。
README.md。
源码与完整 Release 记录:GitHub Releases · 仓库主页
单文件智能外壳:免安装、运行时自动补齐,主流 Windows 桌面即可运行
Windows 10 / 11(64 位)
.NET 10(缺失时外壳自动安装)
多数功能需「以管理员身份运行」
单文件 exe ~10 MB,免安装可携带
从下载到还原,整个过程不超过两分钟
点击上方「下载 v1.20」按钮,单文件约 9.6 MB,无需安装。
右键 exe → 「以管理员身份运行」,多数功能需要提权。
在左侧导航挑选要用的功能,如「系统优化」「清理优化」。
勾选目标项,点「开始优化 / 清理」;重大更改前建议先建还原点。
不满意?各模块提供「一键还原」,或用「系统工具 → 还原点」回退。
使用前建议先阅读,帮助您更安全高效地使用本工具
绝大多数修改系统设置的功能(如系统优化、服务优化、Defender 管理)需要管理员权限。请右键点击 exe,选择「以管理员身份运行」。
大部分功能都提供「一键还原」或反向操作。例如在「系统优化」页面点击「还原所有项」,在「服务优化」页面点击「一键还原」。如果不确定,可随时使用「系统工具 → 系统还原点」进行系统恢复。
该功能是一个「启动器」。它会在您的电脑上打开一个提权后的 PowerShell 窗口,并自动执行来自 https://get.activated.win 的官方 MAS 脚本。本工具本身不包含、不修改任何激活代码。MAS 是一个开源项目,您可以在其 GitHub 查看源码。
「常用软件」模块的下载链接来自官方源或 Chocolatey 社区,可能受网络环境影响。您可以尝试更换网络环境,或检查软件的下载地址是否仍然有效。对于部分软件,工具也提供了「官方下载页解析」作为兜底策略。
将旧电脑 Config\ 文件夹下的 autosave.json 及配置备份文件复制到新电脑 exe 同目录下的 Config\ 文件夹中,即可恢复所有设置。