SoftwareInstall.cs 新增 ReadTimeoutMs / DownloadTimeout 可配置字段,Geek 配置总超时 900s + 读空闲 120s,应对极慢速服务器(~12 KB/s)反复超时失败。
%LOCALAPPDATA%\CpqSystemTool\Portable\{id}\ 改为桌面根目录,打开即可见;同步更新 KnownExePaths 检测路径。
src.zip 为内嵌资源(供「导出源码」使用),不是 Release 资产;Release 仅上传 exe + README.md。
catch {} / catch (Exception) {} 静默吞异常(改为 DebugLog.Ignore(ex) 记录日志,便于排查)。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 双重编码回归。
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_* 临时目录。
DownloadAsync 改用 Downloader.DownloadAsync,开启 useProxyFallback: true(系统代理 → 直连 → Watt Toolkit 本地代理依次尝试),最多重试 3 次、间隔 5 秒,解决代理环境下直连失败导致永久挂起的问题。
IsPortable 单文件分支(如 Geek Uninstaller)优先使用用户指定的 customDir,不再硬编码 %LOCALAPPDATA%\CpqSystemTool\Portable\<id>\。
Downloader.DownloadAsync 新增可选 referer 参数,SoftwareInstall.DownloadAsync 透传 SoftwareDef.Referer,确保哔哩哔哩等需要 Referer 头的软件仍可正常下载。
HKCU\Software\Microsoft\Edge\EdgeFlags → 强制重启 Edge 立即生效。
%UserProfile% 改为当前已安装 exe 同级目录(AppContext.BaseDirectory)——覆盖更新(如 v1.14→v1.16)时下载文件默认落到旧版本旁边,不再跳到用户目录。
Grid 16 行 Star 平均分配全部可用空间,标准窗口(740 高)下 16 项正好占满、无底部空白、无滚动条;窗口最大化时每项自动变高。
ScrollViewer(VerticalScrollBarVisibility=Auto),窗口被压缩(小屏 / 高 DPI 缩放)时出现细滚动条,全部导航项仍可达;标题 / 副标题固定顶部不随滚动。
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 的概率。
.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 状态锁 + 按钮禁用联动——并发触发不再竞态写更新地址 / 重复弹下载框。
.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 清零,消除死锁隐患。
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 注入,探针专用单例保留。
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 线程自动重新抓取并刷新「内存使用拆解」视图,效果即时可见。
Whesvc 诊断日志 项(默认不勾选),清理 C:\Windows\Temp\DiagOutputDir\Whesvc 下 Windows 健康状况和优化体验服务生成本地性能追踪 ETL 日志。该日志可安全删除、服务重新启用时会再生;服务运行时文件被占用会自动跳过。
whesvc:在可禁用服务清单新增「Windows 健康状况和优化体验」,风险等级 mid,说明注明「本地性能诊断日志(占C盘),关掉无性能提升、笔记本可能影响节能」。
官网:cpq-system-tool.pages.dev 链接,指向 https://cpq-system-tool.pages.dev/。
tag_name,现改为读取官网根 version.json 的 version/name/url 字段,普通用户无需访问 GitHub、下载更快;版本比较与「下载更新」弹窗逻辑保持不变。
System-Cleanup-Optimizer_vX.XX.exe 改为 系统清理与优化工具_vX.XX.exe(v1.01–v1.08),version.json 的 name/url 同步使用中文名;GitHub Release 资产保留英文名 System-Cleanup-Optimizer_v1.08.exe(规避 gh 中文文件名截断)。
Color.FromRgb(0xE6,0xF7,0xF4),深色模式下始终不变;现改为主题笔刷 _btnSecondaryBg + _accent 高亮文字/边框,与默认态均随深/浅色自动变换。
UiShapes.DisablePopupTopmost)。
UiShapes.ApplyComboBoxTheme,以自定义 ControlTemplate(闭合框 + 下拉弹层均引用主题键)+ ComboBoxItem 样式,让 7 个 ComboBox(版本切换目标 / Office 版本 / Edge 频道 / 驱动引擎 / 分组 / 软件分类 / 风险等级)的背景、字体、边框与下拉弹层(含选中/悬浮态)统一跟随深/浅色主题笔刷,替代默认跟随系统色的 Aero2 模板(深模式下弹层为刺眼白底);弹层刻意关闭 AllowsTransparency 以复用默认 ComboBox 的非置顶行为,避免重新引入浮层问题。
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 构造,统一由共享方法生成(布局与原先完全一致)。
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 许可合规性。
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),杜绝日后混用。
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 失败的问题。
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。