Repository navigation
ClearDesk 2.2.3
ClearDesk 2.2.3
2026-10-27 · Windows 11 · 完整 zip,解压后运行 ClearDesk.exe
这个版本修了什么
- Dock 里有的程序不显示图标(如 Antigravity),或 UWP 程序(如系统「设置」)显示成空白窗口图标、名称为「Application Frame Host」。
原因:取图标失败时被永久缓存,之后一直空白;UWP 窗口属于ApplicationFrameHost.exe,Dock 取了宿主 exe 的图标和名称。
现在:按「应用包图标 → exe 图标 → 窗口自己的图标 → 开始菜单快捷方式 → 通用图标」取;失败不缓存,先显示首字母图标并在 2 / 5 / 15 / 45 秒后自动重试;UWP 应用显示开始菜单里的名称和图标。ClearDesk.exe --dock-diag新增「图标解析」,可逐个应用查看每一级来源。 - 无边框文字阴影更清爽:模糊半径 7 → 2.5(偏移 1、不透明度 0.55),细体字不再被一圈灰雾罩住。屏幕实测时钟数字周围的暗区面积约降到原来的三分之一,仍保留阴影。
- 结束 TranslucentTB 后再打开 ClearDesk,提示「任务栏组件校验失败」而无法启动:可选的透明任务栏组件出问题(文件缺失、损坏、被安全软件隔离、被占用)不再阻止 ClearDesk 启动;会先从
%LOCALAPPDATA%\ClearDesk\taskbar-good的完好备份自动还原,还原不了就暂时关闭该功能并弹出不阻塞的提示,1 / 5 / 30 分钟后自动重试。你自己结束了 TranslucentTB 时,ClearDesk 只记日志,不会强行重新拉起。 - 最小化动画的窗口事件监听失败不再致命。
需要如实说明的
- Antigravity 偶发空白的那一次没能在现场复现(这台电脑上它能正常取到图标);修复针对的是「失败被永久缓存、没有备用来源」这一机制。
- 「结束 TranslucentTB 后校验失败」里的哈希不匹配本身没能复现(正常安装的
taskbar文件夹校验都通过);原因多半是组件文件被替换 / 覆盖了一半、被安全软件隔离或扫描占用。无论哪种,原来「致命退出」的处理方式是错的,已改成非致命并自动修复。 - 文字清晰度:默认大小、有边框的组件 2.2.1 与 2.2.2 的渲染数值完全一致,变虚来自无边框阴影和非默认尺寸。为后者做过「按最终字号排版」的实验,实测没有稳定收益,已默认关闭(环境变量
CLEARDESK_CRISPTEXT=1可开启)。文字阴影只在 100% 系统缩放下实测。 - 测试:自检、回归、客户端歌词、LRCLIB 在线、在线更新端到端五套随包测试记录通过。
下载与校验
- 文件:
ClearDesk-2.2.3.zip(7,648,046 字节) - SHA256:
FCE12423D2974923B1DD65C0F1CC062EA4B66144664C797DF04761B5139C1AC3 - 校验:PowerShell 运行
Get-FileHash .\ClearDesk-2.2.3.zip -Algorithm SHA256,结果应与上面一致;包内还有逐文件的SHA256SUMS.txt。 - 官网也提供同一个文件。包内附完整源码(
source/,含外壳扩展与签名工具源码)。
升级
- 已装 2.1.0 及以上:设置 → 关于 → 软件更新 → 检查更新;或退出旧版本,把 zip 完整解压到新文件夹(不要覆盖旧文件夹),运行其中的
ClearDesk.exe,再确认设置里「登录后自动启动」指向当前这份。 - 2.0.9 及更早版本需要手动升级一次。设置和数据(
%LOCALAPPDATA%\ClearDesk)保留。 - 系统:Windows 11(在 Windows 11 上验证;Windows 10 兼容路径尚未实测),需要 .NET Framework 4.8。
累计更新
以下保留 2.0.9 – 2.2.2 的合并说明,方便连续查看更新。2.1.1、2.2.0、2.2.2 已有单独的 GitHub Release。
累计更新说明:2.0.9 → 2.2.3
这份说明合并了 2.0.9、2.1.0、2.1.1、2.2.0、2.2.1、2.2.2、2.2.3 七个版本的发布说明。2.1.1、2.2.0、2.2.2 已有单独的 GitHub Release;这里按从新到旧排列,方便连续查阅。最新版本是 2.2.3。
- 2.2.3:Dock 图标(Antigravity / UWP)、无边框文字阴影、结束 TranslucentTB 后无法启动。
- 2.2.2:实时模糊下桌面收纳闪烁、Dock 稳定性、组件位置保存、多实例组件、自定义背景、无边框透明背景。
- 2.2.1:番茄钟自定义、图片相册可用、内置音量合成器、收纳系统图标、右键位置新建组件。
- 2.2.0:Dock 管理员权限窗口还原、新增 8 个组件。
- 2.1.1:天气更稳定,显示到区县。
- 2.1.0:签名在线更新。
- 2.0.9:开机自启动修复。
ClearDesk 2.2.3
发布日期:2026-10-27(2.2.2 之后的修补版本)
修复
1. Dock 里有的程序不显示图标(Antigravity、系统「设置」等)
现象:Dock 里正在运行但没有固定的程序,图标是空白,或者是一个通用的「窗口」图标,提示文字还是「Application Frame Host」。
原因(两处,都在 2.2.2 之前就存在,2.2.0 起 Dock 只靠「进程 exe」取图标):
- 失败被永久缓存。
IconCache在后台线程取图标,取不到就把null存进缓存,之后同一个程序一律显示空白,直到重启 ClearDesk。程序刚启动、exe 暂时被占用、外壳图标缓存还没准备好等瞬时失败都会这样。 - UWP / 打包应用的窗口属于 ApplicationFrameHost.exe。 Dock 取的是窗口所属进程(ApplicationFrameHost.exe)的 exe 图标——它没有自己的图标,显示的是系统默认的空白窗口;名称也是它的文件说明「Application Frame Host」。
修复:
- 新的图标解析链(
AppIcons):UWP 宿主窗口先取「开始菜单里该应用的图标」(按 AppUserModelID 走 shell:AppsFolder,256 像素);其余程序先取 exe 图标(跳过系统「通用应用」图标),再取窗口自己的图标(WM_GETICON 大 / 小 / 小2 与窗口类图标,取最大的),再取 AppUserModelID 图标,再取开始菜单里指向该程序的快捷方式图标,最后才是 exe 的通用图标。全透明的图也算失败。 - 失败不再缓存。 取不到时显示一个带首字母的彩色图标,并在 2、5、15、45 秒后自动重试(共 4 次),每次 Dock 重建也会再试;找到后直接替换同一个控件。
- UWP 应用的名称和图标来自「开始菜单」里的应用(例如「设置」),不再显示 Application Frame Host。
ClearDesk.exe --dock-diag现在会逐个列出正在运行的应用以及每一级图标来源的结果,并把每级图标存成 PNG(dock-diag-icons文件夹),方便排查。
验证:在这台电脑上用 --dock-diag 实测——「设置」(ApplicationFrameHost)→ 取到 256 像素的包图标,名称「设置」;Antigravity → exe 图标 256 像素、窗口图标 512 像素。新增 16 项测试(解析顺序、空白 / 通用图标、失败不缓存、重试、UWP 包图标)。
没有复现的部分: 这台电脑上 Antigravity 当前能正常取到图标,所以「Antigravity 空白」的那一次瞬时失败没能在现场复现;修复覆盖的是这类失败的机制(失败不缓存 + 有备用来源 + 自动重试)。
2. 文字不清晰
我们逐项对比了 2.2.1、2.1.1 和 2.2.2 的渲染(把组件在屏幕上真实画出来再截图,同一个灰色背景上量化):默认大小、有边框的组件,2.2.1 与 2.2.2 的清晰度数值完全一致,没有代码层面的回退;变糊来自无边框模式(2.2.2 新增)和非默认尺寸这两种用法。
原因:
- 无边框文字阴影太糊(主要原因,已量化):2.2.2 的阴影模糊半径 7、不透明度 0.6、性能优先渲染,细体字(Segoe UI Light)周围罩了一圈灰雾,看起来像字发虚。屏幕实测,时钟数字周围被阴影压暗的面积(每个文字像素对应的暗区像素数):无阴影 0.00,2.2.2 为 3.34,2.2.3 为 1.10。
- 组件不是默认尺寸时,文字是先按默认大小排版再整体放大的,笔画落在小数像素上,边缘变成两个像素的灰边(默认大小的组件不受影响)。
修复:
- 无边框文字阴影改为:模糊半径 2.5、偏移 1、不透明度 0.55、高质量渲染——仍有阴影(深色壁纸 / 亮色壁纸上都可读),但暗区面积降到原来的三分之一。有测试断言:2.2.3 的暗区小于 2.2.2,且大于无阴影。
- 为第 2 点做了「文字块按最终字号排版再用 1/缩放 缩回」的实验(
CrispText,对所有组件的所有文字块生效,自动处理后来添加的文字、组件自己改字号、缩放回 1 时恢复)。实测结论:没有稳定收益——在 5 种组件 × 3 种放大倍数(15 组)里,亮色笔画「完全点亮」比例的平均变化约 +0.004(9 组变好、6 组变差,时钟 ×1.35 明显变差),属于噪声。所以默认关闭(不改变任何组件的排版),只保留代码和测试,设置环境变量CLEARDESK_CRISPTEXT=1可以打开继续试。我们没有把一个没有被测量证实的改动默认发给所有组件。
验证与对比图:docs/images/2.2.3(shadow-before-after.png:2.2.2 / 2.2.3 / 无阴影的时钟实拍,shadow-before-after-zoom.png 放大 3 倍);测试输出里的 text shadow (screen) 行是上面的数字。
局限:这一项只在 100% 缩放的这台电脑上量过;125% / 150% 系统缩放下没有实机对比(离屏渲染无法复现系统 DPI 的取整)。如果你的屏幕是 125% / 150% 且仍觉得字发虚,请告诉我们系统缩放比例和是哪个组件,需要单独看。
3. 退出 TranslucentTB 后再打开 ClearDesk,提示「任务栏组件校验失败」无法启动
现象(用户反馈):在任务管理器里结束 TranslucentTB.exe,再打开 ClearDesk,弹出「任务栏组件校验失败」,ClearDesk 起不来。
原因:「透明任务栏」是 ClearDesk 自带的可选组件(TranslucentTB)。2.2.2 及以前,ClearDesk 启动时就在主流程里校验 taskbar 文件夹里的每个文件(SHA-256 对照 verified.sha256),任何一项不符、缺失、被占用、被安全软件移走,都会直接抛异常,走到「ClearDesk 启动失败」对话框并退出——一个可选功能出了问题,整个程序都不能用;而且「透明任务栏」开关是保存在设置里的,所以每次启动都会再失败一次,用户只能手动改设置文件。结束 TranslucentTB 本身不会改动文件内容,所以真正让校验不通过的一般是:组件文件被替换 / 覆盖了一半(运行中的 exe 被占用,覆盖解压时旧 exe 留下而清单是新的)、被安全软件隔离或改写、或文件正被扫描占用;在我们这台电脑上,正常安装的两份 taskbar 文件夹校验都是通过的,所以没有能直接复现「结束进程后校验失败」这个哈希不匹配本身——但可以确定:不管是哪种原因,2.2.2 的处理方式(致命退出)是错的。
修复(2.2.3):
- 启动不再因为可选组件而失败:
Services.Apply()外加保护,组件校验失败只记日志、弹一条不阻塞的托盘提示(「透明任务栏暂不可用…ClearDesk 其他功能不受影响」),ClearDesk 照常启动。窗口事件监听失败(最小化动画)同样不再致命。 - 按需校验:只有在要启动透明任务栏时才校验;校验时用共享方式读文件(运行中、正被扫描的文件也能读),被占用就重试几次,仍被占用算「暂时不可用」而不是「损坏」。
- 自动修复:第一次校验通过后,把完好的组件备份到
%LOCALAPPDATA%\ClearDesk\taskbar-good;之后发现文件缺失、被改动、被隔离、清单缺失或无效,先从备份还原(正在被占用的文件先改名挪开再写入),还原后再次校验通过就正常启动。 - 没法修复时:关闭这个功能(不改你保存的开关),并在约 1 分钟、5 分钟、30 分钟后自动再试;在设置里把开关关掉再打开也会重试。
- 你自己在任务管理器里结束了 TranslucentTB:ClearDesk 发现后只记一条日志,不会自动再拉起来跟你对着干(下次启动 ClearDesk,或把开关关掉再打开,才会重新启动它);过期的恢复状态文件不会影响下一次启动(按进程路径核对,不会误关别的进程)。
- 已有独立运行的 TranslucentTB 时:只给出提示,不改它的配置(和以前一致,但不再导致 ClearDesk 无法启动)。
测试(V223TaskbarTests,20 项,用一个假的组件目录,不碰真实的 TranslucentTB):健康启动并保留完好备份;进程被结束后的过期状态;文件损坏 / exe 缺失(相当于被隔离)/ 清单缺失 / 清单无效 → 从备份还原并启动;文件被独占锁定 → 不崩溃、不启动、稍后重试,锁释放后启动;文件正被别处打开且已损坏 → 改名挪开后还原;损坏且无备份 → 返回原因而不抛异常(旧的 Start() 仍抛异常,兼容旧调用);独立 TranslucentTB 在运行;DesktopServices 启动路径不抛异常、修好后重试成功、运行中 TranslucentTB 被结束后 ClearDesk 继续运行。
其他
- 版本号统一为 2.2.3。
- 新增诊断与测试:
--dock-diag的「图标解析」;tests/V223Tests.cs、tests/V223TaskbarTests.cs、tests/TextProbe.cs(屏幕实拍的清晰度度量)。
ClearDesk 2.2.2 发布说明
发布日期:2026-10-27
本版回应 7 条反馈:桌面收纳激活时闪一下、Dock 偶尔跳动、部分组件重启后位置变化、图片相册只能新建一个、时钟组件可去掉边框、所有组件可自定义背景图、组件放大时边长(边距)没有按比例缩放。
1. 点别的窗口再点「桌面收纳」会闪一下
- 现象的前提:设置里开启了「动态壁纸实时模糊」(你的设置里是开的)。实时模糊不是画在组件里的,而是组件正下方的一个独立窗口(DWM 主机背景)。
- 原因:组件被激活 / 被固定到桌面最底层(2.0.8 的「锁定后固定在最底层」)时,z 序改变,但模糊窗口只在组件移动 / 改大小时才跟着调整,其余靠每 1.5 秒一次的定时器——这段时间里模糊层停在组件上面,看到的就是一块没有图标和文字的模糊块,然后「闪」回正常。
- 修复:给组件窗口挂
WM_WINDOWPOSCHANGED,z 序或位置一变立刻把模糊窗口放回组件正下方。 - 测试:对真实的 DWM 模糊窗口反复切换 HWND_BOTTOM / HWND_TOP / NOTOPMOST,每次都必须紧贴在组件下方(4/4);另有「复现」测试,关闭修复后同样的操作 3 次里 3 次错位。
2. Dock 栏有时不稳定、会跳动
- 原因(代码分析 + 计数测试,没有在你的机器上抓到现场):Dock 订阅「运行中的应用」变化,任何程序开 / 关任何窗口都会触发整个 Dock 重建,重建会让悬停放大归零、底板重新排版;另外自动隐藏在窗口激活 / 最小化的瞬间会得到忽大忽小的矩形,Dock 就滑出又滑回。
- 修复:重建请求合并 250 毫秒,并比较「应用列表 + 顺序 + 运行状态」的签名,相同就跳过(
RebuildCount/SkippedRebuilds计数);自动隐藏后重新出现需遮挡消失 280 毫秒;隐藏、指针唤出仍然立即。 - 测试:签名规则、延迟显示规则、对真实 Dock 连发 5 次「应用变化」不重建。
3. 有些组件重启后位置变了
排查了保存和恢复路径,找到三处,已逐一修复并加测试:
- 新建组件的位置不立即保存:
NewWidget在创建窗口之前保存,创建后的位置(尤其是 2.2.1 的「出现在鼠标右键位置」)要等到下一次无关的保存才写盘;直接重启就回到默认位置。现在创建后立即保存。 - 系统移动窗口被当成用户移动:显示器 / 缩放 / 工作区变化(登录、睡眠恢复、接拔显示器、顶部任务栏收放)时 Windows 或 WPF 会挪动窗口,旧代码把每一次
LocationChanged都写进 settings.json。现在新增PositionGuard:组件刚加载后的 4 秒、以及收到WM_DPICHANGED/WM_DISPLAYCHANGE/WM_SETTINGCHANGE/DisplaySettingsChanged后的 2.5 秒内,没有拖动、没有按住鼠标的位置变化不保存,稳定后若与已保存位置不同且已保存位置可见,就放回去。 - 启动时的「是否在屏幕内」检查:旧代码拿 DIP 坐标去和像素的
WorkingArea比较,还受顶部任务栏保留区影响,不合格就改到 (20,20)。现在按 DIP 和整块屏幕判断,真的不可见时只在视觉上救回,不覆盖已保存的位置(用户下次拖动才更新)。
说明:你这台是单显示器、100% 缩放,我没能在这台机器上复现「系统挪动窗口」的现场,2 的机理来自代码分析和模拟(测试里用 NoteSystemChange + 手动改 Left/Top 模拟);1 是确定可复现的(测试里:新建 → 不做别的 → 读磁盘上的 settings.json)。
测试:14 种组件「放置 → 保存 → 像 settings.json 一样序列化 → 关闭 → 读回 → 重新创建」位置不变;右键新建后磁盘上立即有位置;不可见的保存位置不被覆盖;系统挪动不保存且会放回;正常拖动仍然保存。
4. 图片相册(及其他)可以放多个
- 实例编号:第一个仍叫
album(所有 2.2.x 的文件、文件夹、设置原样可用),后面是album~2、album~3…;每个实例有独立的设置项(settings.json的Widgets)、数据文件(widgets\album~2.json)、图片文件夹(widgets\album-images~2)、背景图。 - 适用:图片相册、待办清单、倒计时 / 番茄钟、日程、快捷启动。仍是单个:剪贴板历史(只有一个系统剪贴板)、网速流量、日出日落 + 空气质量,以及时钟、天气、音乐、日历、黄历、性能、快捷控制。
- 用法:桌面右键 / 组件右键 → 新建组件 → 图片相册,已有一个在桌面上时会新建「图片相册 2」,窗口标题带编号,默认位置错开一点;设置 → 组件管理逐个列出(名称带编号),可显示 / 关闭 / 重置大小 / 定位 / 删除。关闭只是隐藏(再显示是原来那个,不会新建);删除第 2 个及以后的实例会清掉它的数据和图片副本,第一个保持 2.2.x 的行为(保留数据文件)。编号被释放后会复用(得到一个空的)。
- 迁移:不需要迁移——已有的单个组件就是第一个实例,数据文件和图片文件夹没有移动。
- 测试:2.2.1 布局的相册升级后设置和图片完整;创建 3 个相册,图片、间隔、铺放、背景、位置、锁定、大小各自独立;序列化后重启全部恢复;组件管理列表 / 隐藏 / 再显示 / 删除只影响自己;待办条目、番茄钟设置各自独立;剪贴板、网速、日出日落仍是单个。
5. 无边框 / 透明背景
- 右键 →「无边框 / 透明背景」:不画玻璃面板、边框、材质、模糊,只显示内容;「文字阴影(无边框时)」默认开,保证在任何壁纸上可读。
- 仍可拖动(空白处也接收鼠标,只是不画出来)、调整大小(悬停时才出现右下角手柄)、锁定、折叠;设置按组件保存,重启保留;每个实例单独设置。
- 可用:时钟、日历、黄历、天气、音乐、性能、快捷控制、待办、倒计时 / 番茄钟、日程、剪贴板、网速、快捷启动、图片相册、日出日落、桌面收纳。不提供:便签(本身就是彩色纸)、Dock、启动台。
- 和自定义背景可同时用:无边框 + 背景图 = 只有一张圆角图片加内容。
- 测试:开关后外圈 6 像素内完全没有像素(对比玻璃时 5935 个);空白处命中测试仍有目标;阴影可关;锁定可用;保存、重启恢复、关闭后边框回来。
6. 所有组件的自定义背景
- 右键 →「自定义背景」:选择图片…、从剪贴板粘贴(复制的图片或图片文件)、把图片拖到组件上(相册、收纳格、便签、快捷启动自带拖放行为,仍用菜单);填充方式:填充(裁剪铺满)/ 适应(完整显示)/ 拉伸;图片不透明度 100–20%;压暗 0–60%(默认 25%,让文字看清);移除背景。
- 图片复制进
%LOCALAPPDATA%\ClearDesk\widgets\backgrounds(每个组件实例一份,原文件删除后仍可用;最大 40 MB;非图片或损坏的文件会被拒绝并保留现有背景;超大图按 2400 像素宽解码);换图 / 移除时删除旧副本。 - 随组件缩放:背景是铺在组件内容下面的一层,跟随组件宽高实时变化(填充模式居中裁剪);圆角裁剪;和玻璃 / 雾面材质、实时模糊、无边框、锁定、多实例同时使用。
- 测试:中文文件名、复制进数据文件夹、放大 1.8 倍后图层与组件同尺寸、三种填充、不透明度 / 压暗、各组件互不影响、原文件删除 + 重启 + 锁定 + 自定义大小后恢复、换图删旧副本、移除只删自己的、拖放文件(跳过不存在的)、拖放图片数据、粘贴、非图片 / 损坏文件拒绝、便签和收纳格也能用。
7. 组件放大时边长(边距)自适应
- 理解:组件放大时内容会按比例放大,但边距、间距、字号层级看上去没有跟着变——我把「边长」理解为边距 / 间距 / 圆角这类边框度量。(如果你指的是别的现象,请告诉我。)
- 原因:① 内容缩放上限 2.5 倍,而尺寸上限是 4 倍,放到 2.5 倍以上内容和边框都不再放大,只剩更多空白;② 瘦高或扁宽的组件,缩放按宽高中较小的比例,另一方向多出的空间全部变成空白,外边距不变;③ 番茄钟页签、阶段文字、按钮字号相对 46 号时钟偏小。
- 修改:内容缩放上限提高到 4 倍(与尺寸上限一致;边框、圆角、手柄本来就随内容一起缩放);多出的空间按比例增加外边距(
EdgeFactor,1×~2×,默认形状仍是 20);番茄钟的间距按多出的高度拉开(最多 3 倍)并居中;页签 12→15、阶段文字 13→16、按钮 12→14、今日完成 12→14、方案摘要 12→13。 - 测试:缩放 / 边距 / 间距的数学与夹取;日历瘦高时边距 20→40,同比例放大回到 20,重置回到 20;放大 4 倍内容缩放 = 4。渲染对比图在发行包的
source/docs/images/2.2.2/(pomodoro-compare-221-vs-222.png为 2.2.1(上)与 2.2.2(下)同尺寸对比,2.2.1 原图在before221/;单张:番茄钟 1×1、1×2、2×2、2.5×1、3.5×3.5,时钟玻璃 / 无边框 / 无边框 + 背景 / 玻璃 + 背景 / 瘦高)。
其他
- 版本号统一为 2.2.2。开发者快捷方式:环境变量
CLEARDESK_ONLY=v222配合--regression-test只跑本版测试。
测试
新增 tests/V222Tests.cs(规则测试 + 窗口测试);自检、回归、客户端歌词、LRCLIB 在线测试、在线更新端到端测试结果见发行包里的 txt 文件。
ClearDesk 2.2.1 发布说明
发布日期:2026-10-26
本版回应 5 条反馈:番茄钟时长可自定义、图片组件(图片相册)无法使用、快捷控制内置音量合成器、桌面收纳里加入此电脑 / 回收站等系统图标、新建组件直接出现在鼠标右键的位置。
1. 番茄钟时长可自定义
- 倒计时 / 番茄钟 → 番茄钟页,点「25 / 5 / 15 分钟 · 每 4 轮长休息 ⚙」(或右键菜单 →「番茄钟设置…」)打开设置面板:专注、短休息、长休息的分钟数,以及几轮专注后长休息,每项都有 − / + 按钮,可直接输入数字,也可用鼠标滚轮调整。
- 范围:专注 1–180 分钟,短休息 1–60,长休息 1–120,几轮后长休息 2–12。输入空白、小数、负数、文字或超出范围时不会保存,面板里显示原因。
- 预设:经典 25/5/15(4 轮)、50/10/20(4 轮)、45/15/30(3 轮)、90/20/30(2 轮),一键应用。
- 修改后立即保存(
%LOCALAPPDATA%\ClearDesk\widgets\countdown.json),重启后保留;手动改坏的数值会被修正到合法范围。正在计时的这一轮不受影响,新的时长从下一轮开始;未在计时时立即生效。
2. 图片组件(图片相册)无法使用
先说明理解:反馈里的「图片组件」按「现在的图片组件完全不可以用」处理为 2.2.0 新增的图片相册(它是桌面上唯一专门放图片的组件;便签里的插入图片功能没有改动)。
原因
- 在真实电脑上用真实的图片解码器测试过:含中文、
#、%的文件名和 3000 像素的大图都能正常显示,所以问题不在图片解码。 - 2.2.0 的图片相册只有右上角一个很小的「+」按钮,只能选整个文件夹;没有选择单张图片的入口,不支持把图片拖进来,不支持粘贴(Ctrl+V),空白状态也只有一句「还没有图片」,没有任何可点的按钮。对只想放一张图片的人来说就是「没法用」。
- 选择文件夹的对话框没有归属窗口:组件固定在桌面最底层,对话框有可能出现在其他窗口后面,看上去点了没反应(这一条在测试里无法稳定复现,按「可能原因」处理,已一并修复)。
- 图片只是记录原路径,原文件被移动或删除后组件就变空。
现在
- 空白状态显示「添加图片…」大按钮和说明;右上「+」菜单、右键菜单都有「添加 / 更换图片…」「粘贴图片」「添加图片文件夹…」。
- 支持三种方式:文件对话框(可多选)、把图片文件 / 文件夹 / 网页里拖出的图片拖进组件、复制图片后 Ctrl+V 或右键 → 粘贴图片(也支持复制的图片文件)。
- 单张图片会复制到 ClearDesk 的数据文件夹(
%LOCALAPPDATA%\ClearDesk\widgets\album-images,内容相同只存一份,最多 300 张、单张不超过 40 MB),原文件删除后仍然显示;文件夹则保持引用。重启后保留。 - 右键 → 铺满(裁剪)/ 完整显示,设置保存;右键 → 移除当前图片(复制进来的会删除副本,文件夹里的图片只是隐藏,绝不会删除你的原文件)、清空全部图片。
- 快捷启动里的文件对话框也改为有归属窗口,不会躲到后面。
3. 快捷控制内置音量合成器
- 点「声音」不再打开系统设置,而是在组件内滑入「音量合成器」页(淡入 + 平移),左上 ← 返回。
- 页面内容:主音量滑块与静音、当前输出设备(点击可切换);下面是每个应用一行——图标、名称、音量滑块、静音按钮、百分比;包含「系统声音」;同一个程序的多个声音会话合并为一行一起调整;没有应用在发声时显示提示。
- 通过 Windows Core Audio(IAudioSessionManager2 / ISimpleAudioVolume)读取和设置,名称和图标取自进程。只在页面打开时每 1.5 秒刷新,返回或关闭组件立即停止并释放。
- 没有滚动条:应用多时用鼠标滚轮滚动;组件拉大时自适应。底部有小链接「打开系统音量合成器」。
- 真机验证:读取到系统声音和 8 个应用会话;只对 ClearDesk 自己的会话做了设置 / 静音 / 恢复往返测试(均成功并已恢复),没有改动其他软件的音量。可用
ClearDesk.exe --mixer-diag [输出文件]查看。
4. 桌面收纳里的此电脑、回收站等
- 桌面收纳 / 收纳格右键 →「添加系统图标」:此电脑、回收站、控制面板、用户文件夹、网络,勾选即添加,再点取消。图标是 Windows 的真实图标,回收站按空 / 满显示不同图标并随状态变化。
- 点击通过资源管理器打开(
explorer.exe shell:::{...});回收站右键有「打开」「清空回收站」(Windows 自己的确认窗口)。 - 「收集桌面」模式会收集桌面上已显示的系统图标(按 Windows「桌面图标设置」;未设置时只有回收站,这是 Windows 默认);可以从格子里隐藏、再添加回来。
5. 新建组件直接出现在鼠标位置
- 桌面右键 → ClearDesk 新建组件(原生菜单和经典菜单都是)、组件右键菜单里的「新建…」、收纳格右键 →「新建收纳格」创建的组件,左上角出现在你右键点击的位置(30 秒内的右键有效)。
- 位置限制在鼠标所在显示器的工作区内,不会跑出屏幕或压到任务栏;多显示器、负坐标、缩放比例不同(按 DPI 换算)都已处理;遵守「磁吸对齐」,贴近其他组件或屏幕边缘时吸附(按住 Alt 关闭吸附,或在设置里关闭磁吸)。
- 从设置 / 组件管理 / 托盘创建时没有鼠标上下文,保持原来的默认位置;已经在桌面上的单实例组件不会被移动。
其他
- 版本号统一为 2.2.1。新增诊断模式
--mixer-diag。
测试
新增测试:番茄钟设置校验 / 保存 / 轮次、图片相册(真实解码、对话框、拖放、粘贴、复制到数据文件夹、删除原图、重启保留、铺满 / 完整、移除)、音量合成器模型与页面(分组、命名、排序、滑块、静音、读取失败、真实会话读取)、系统图标(识别、打开命令、桌面图标收集、回收站空 / 满图标、菜单)、新建位置计算(多显示器、负坐标、DPI、边缘限制、磁吸、过期)。自检、回归、客户端歌词、LRCLIB 在线测试、在线更新端到端测试全部通过,结果见发行包里的 txt 文件。
ClearDesk 2.2.0 发布说明
发布日期:2026-10-26
修复:Dock 里的 Sparkle、英雄联盟最小化后再点击弹不出来
原因
- Sparkle、英雄联盟客户端(LeagueClientUx.exe)是以管理员权限运行的程序,ClearDesk 是普通权限。Windows 的 UIPI(用户界面特权隔离)不允许普通权限进程对管理员权限的窗口调用
ShowWindow/OpenIcon还原——调用直接返回 5(拒绝访问),窗口依旧最小化。旧版 Dock 正是用这两个调用还原窗口,所以第一次点击会启动应用,最小化后再点就再也弹不出来。 - 英雄联盟还有第二个问题:Dock 固定的是 Riot 启动器,而真正的窗口属于它启动的 LeagueClientUx.exe,两者不是同一个 exe,Dock 认为「应用没有窗口」。
- 另有一类应用关闭窗口后只留在托盘,窗口是隐藏的,Dock 同样看不到。
现在怎么做
- 还原窗口改为向窗口发送
WM_SYSCOMMAND(SC_RESTORE / SC_MINIMIZE)消息:这类消息可以越过 UIPI,管理员权限窗口同样会响应。最小化用 SC_MINIMIZE。依次尝试:显示被隐藏的窗口 → SC_RESTORE(最多等 0.5 秒确认)→ ShowWindow / OpenIcon 兜底 → 置前(不模拟任何按键)。 - 窗口匹配增加「启动器 → 客户端」识别:沿进程的父进程链查找被固定的 exe(排除 explorer、cmd、powershell、svchost、ClearDesk 本身这类中性父进程,避免把无关程序归到一起),所以 Riot 启动器的图标会对应 LeagueClientUx 的窗口。
- 没有可见窗口时,先找该应用隐藏的主窗口(托盘程序),能显示就显示;显示不了才重新启动一次(单实例程序收到第二次启动后会自己把窗口弹出来)。
- 还原失败或窗口已消失时,不再「点了没反应」:自动退回到启动应用;同一个窗口的并发点击会合并。
验证
- 在真实运行的 Sparkle(管理员权限)和 LeagueClientUx(管理员权限)上用 ClearDesk 的真实还原代码测试:最小化 → 还原 → 前台都成功;测试后窗口状态已恢复。可用
ClearDesk.exe --dock-diag [输出文件]查看窗口、是否管理员权限和父进程链,--dock-activate <exe 关键字>对单个应用做同样的还原测试。 - 自动测试:用模拟窗口覆盖「管理员窗口」「应用忽略 SC_RESTORE」「窗口消失」「托盘隐藏窗口」「管理员托盘窗口」等情形,另有一个真实 WPF 窗口的最小化/还原测试。
局限
- 最小化到托盘的管理员权限应用,普通权限的 ClearDesk 无法把它的隐藏窗口重新显示出来;此时 Dock 退回到再次启动该应用,由应用自己(通常是单实例逻辑)弹出窗口。这一条只有单元测试,没有在真实的托盘管理员应用上验证。想彻底避免,可以用管理员权限运行 ClearDesk(本版没有这样做)。
新增 8 个桌面组件
全部沿用现有组件的风格:自由拖动、锁定、拖右边缘 / 下边缘 / 右下角调整宽高(内容重新排版)、白色 Windows 11 右键菜单、组件管理、材质、对齐参考线、位置与大小保存;在 桌面右键 → ClearDesk 新建组件(包括原生外壳菜单)和 设置 → 外观与材质 → 桌面组件里都有入口。后台定时器只在组件可见且未折叠时运行,启动时不做任何联网或重活。数据保存在 %LOCALAPPDATA%\ClearDesk\widgets\(写入先写临时文件再替换;文件损坏时改名保留,组件从空白开始)。
- 待办清单:添加、勾选、删除、↑↓ 调整顺序、隐藏 / 清除已完成。到期时间写法:
18:30、明天 9:00、后天、10/28 14:00、2026-12-01 08:00、30m、2小时后。到期弹出托盘通知和组件提示,同一项只提醒一次,取消勾选后重新生效。 - 倒计时 / 番茄钟:倒数日(考试、生日;可设「每年」,2 月 29 日在平年算 2 月 28 日),距离近的在前,已过的在后;番茄钟开始 / 暂停 / 重置 / 跳过,默认 25/5/15 分钟、每 4 个番茄一次长休息(可改,如
50/10/20),阶段结束弹通知并提示音,今日完成数保存。1 秒定时器只在番茄钟运行时存在。 - 日程:今天和明天,快速添加(
明天 14:00 项目评审、10/28 面试、18:00 跑步,不写时间为全天),点一条即可编辑,可删除;可导入.ics日历文件(UTC 时间换算为本地,全天事件,折行和转义)。不读取 Windows 日历:Windows 没有免密钥的本地读取接口;.ics 的重复规则(RRULE)不展开。 - 剪贴板历史:记录文本和图片,点一条重新复制(只是放回剪贴板,需要你自己按 Ctrl+V),可固定、删除、清空(保留固定项)、暂停记录。不记录:带「排除」格式(ExcludeClipboardContentFromMonitorProcessing、CanIncludeInClipboardHistory = 0)的内容,以及密码管理器(KeePass、1Password、Bitwarden 等)复制的内容。数量限制:文本 40 条(每条不超过 20000 字)、图片 6 张(单张 4 MB、合计 16 MB)。默认只放在内存里,退出即清除;可在右键菜单打开「保存文本历史」,此时只保存文本,并用 Windows 当前用户的 DPAPI 加密;图片永远不写入磁盘。
- 网速流量:实时下载 / 上传速度、今日累计流量(跨天自动清零、重启保留)、60 秒迷你曲线。只统计物理网卡,VPN / TUN / Hyper-V / VMware 等虚拟网卡不重复计数;处理 32 位计数器回绕和网卡重置。右键可「清零今日流量」。
- 快捷启动:文件、文件夹、网址、应用的图标网格(系统图标),把文件拖进来即可添加,右上 + 可添加文件 / 文件夹 / 网址,点击打开,右键移动、重命名、移除;去重,最多 60 项,列数随宽度变化。
- 图片相册:选择文件夹或图片,淡入淡出轮播,间隔 3 秒到 5 分钟,铺满 / 完整显示,顺序 / 随机(一轮内不重复),可含子文件夹,最多 2000 张。图片按组件大小用 DecodePixelWidth 解码(最大 1920 像素宽),大照片不会占满内存;组件隐藏时暂停。
- 日出日落 + 空气质量:日出、日落时间由坐标离线计算(NOAA 公式,误差约 1 分钟,支持极昼 / 极夜),不联网;位置沿用 2.1.1 的天气位置(手动区县 → 缓存 → Windows 定位 → IP)。空气质量(AQI):中国境内先问腾讯天气(区县,再市级),再用 Open-Meteo(美标 AQI),均无需密钥;结果缓存到
widgets\sunair.json,联网失败时显示缓存并注明更新时间;失败后退避重试,网络变化时立即刷新。注意两种来源的 AQI 标准不同(国标 / 美标),组件会标出来源和标准。
其他
- 设置 → 外观与材质 → 桌面组件 增加 8 个开关;组件管理列出这 8 个组件。
- 新增诊断模式
--dock-diag、--dock-activate。 - 版本号统一为 2.2.0。
测试
自检、回归(含 8 个新组件的窗口创建、保存、提醒、回退等测试)、客户端歌词、LRCLIB 在线测试、在线更新端到端测试全部通过,结果见发行包里的 txt 文件。
ClearDesk 2.1.1 发布说明
发布日期:2026-10-25
天气组件:更稳定,并显示到区县
问题的原因
- 以前的天气只有一条链路:IP 定位服务 ipwho.is → 天气源 Open-Meteo,两者都是境外服务,在国内网络里经常超时或被拦;任何一环失败就显示「自动天气暂不可用」,也没有缓存可以显示。
- 使用 Clash / Mihomo 等代理(系统代理或 TUN)时,境外的 IP 定位服务看到的是代理出口(例如美国),于是曾把城市显示成「華盛頓哥倫比亞特區」。
- 以前的位置只到城市,国内 IP 定位本来也只有城市级精度。
现在怎么取天气
- 位置(按顺序,前一步成功就不再往下):
- 手动选择的区县(设置里可搜索选择,不联网定位)。
- 上次成功的位置(Windows 定位 3 小时内、IP 定位 6 小时内有效)。
- Windows 定位服务(Wi-Fi / GPS,可到街道级,不受代理影响;需要在 Windows 设置 → 隐私和安全性 → 位置 中允许桌面应用访问位置)。
- IP 定位:同时问多个服务并投票——太平洋电脑网 pconline、ipip.net、哔哩哔哩(国内三个优先);国内服务有结果时不再请求 ipwho.is、ip-api.com。中国时区的电脑上忽略境外结果(视为代理出口)。IP 定位只能到城市级,见「局限」。
- 以上都失败时沿用上一次的位置。
- 区县名称:用坐标做反向地理编码(BigDataCloud,失败时 OpenStreetMap Nominatim,中文)得到省、市、区县,只显示区县级名称:「呼和浩特市赛罕区」→ 赛罕区,「上海市黄浦区」→ 黄浦区;县级市、县、旗显示它自己的名称(如 土默特右旗);没有区县的城市显示市名。名称统一为简体并去掉省/市前缀(區→区、華盛頓→华盛顿)。
- 天气来源(国内:腾讯天气 → Open-Meteo → met.no → wttr.in;国外:Open-Meteo → met.no → wttr.in):均无需密钥。第一个来源超过 3.5 秒还没回答,就同时启动下一个(先到先用,慢的被取消);单次请求最长 8 秒。天气按区县的坐标 / 名称查询。腾讯天气不认识某些旗县名称时,自动改用所属城市的数据,来源标注为「腾讯天气(市级)」。
- 缓存:最后一次成功的天气和位置保存在
%LOCALAPPDATA%\ClearDesk\weather-cache.json(只存取整后的坐标和地名,不存 IP 地址)。联网失败时组件继续显示这份数据并注明「更新于 HH:mm」,不再出现错误卡片;只有从未成功过时才显示错误提示。 - 刷新节奏:正常每 20 分钟一次;失败后按 1、2、4、8、15 分钟指数退避(带随机抖动);网络切换、从睡眠恢复时立即刷新;窗口关闭时取消网络请求。HTTP 请求遵循系统代理设置。
- 组件底部小字显示数据来源和位置来源(Windows 定位 / 网络 IP / 手动选择);布局、调整大小、多日预报行不变。
设置(设置 → 外观与材质 → 天气)
- 自动天气(联网)开关:与以前一样,默认关,需要主动开启。
- 使用 Windows 定位:默认开;关闭后只用 IP 定位。
- 所在地:显示当前位置和来源,「重新定位」立即重新定位并刷新。
- 手动选择区县:输入「赛罕区」「黄浦区」等搜索,从结果里选择;「恢复自动」回到自动定位。手动选择不做 IP / Windows 定位。
局限
- IP 定位只能到城市级,有时还是运营商登记的城市,不是你所在的城市(例如本机 IP 被几个服务一致识别为包头,Windows 定位则给出具体的旗县)。想要准确的区县,请开启 Windows 定位,或在设置里手动选择。
- Windows 定位需要系统位置服务打开;台式机没有 GPS / Wi-Fi 时精度较差,可能取不到。
- 腾讯天气接口无需密钥,但不是公开文档的接口,将来可能变化——所以保留了三个备用来源;wttr.in 只有 3 天预报。
- 反向地理编码和搜索使用境外的 BigDataCloud / Nominatim(有请求频率限制),只在位置变化时调用并缓存结果。
- 请求只带 User-Agent
ClearDesk/版本号,不发送设置或文件信息;查询会把取整后的坐标(约 1 公里)发给上述服务。
诊断
ClearDesk.exe --weather-diag [输出文件] [轮数] 依次测试 Windows 定位、各 IP 服务、反向地理编码、各天气来源和完整流程,写出诊断报告;不修改设置和缓存,不影响正在运行的 ClearDesk。
其他
- 修复 .NET Framework 把 deflate 压缩的响应读错的问题(Open-Meteo 曾报「块的长度与它的补集不匹配」):现在只协商 gzip。
- 版本号统一为 2.1.1;在线更新测试脚本
scripts/test-update.ps1不再写死版本号。
ClearDesk 2.1.0 发布说明
发布日期:2026-10-25
新增:在线更新
2.1.0 起,ClearDesk 可以自己检查并安装新版本,不必再手动下载 zip、解压、替换。
怎么用
- 启动后约 75 秒在后台检查一次(距上次检查不足 12 小时则不再检查,不影响启动速度)。设置 → 关于 → 软件更新 里有 检查更新 按钮和 自动检查更新 开关。
- 发现新版本时弹出白色对话框,显示版本号和更新说明,按钮:立即更新 / 稍后提醒(24 小时后再提示)/ 跳过此版本(该版本不再提示,更新的版本仍会提示)。
- 点「立即更新」:下载(有进度,网络中断后可从断点继续,自动重试)→ 校验 → 退出 ClearDesk → 替换文件 → 自动重新启动。整个过程不需要管理员权限。
更新源
- 默认:
http://101.200.206.248/versions.json(阿里云轻量服务器,nginx;以后换成域名 / https 只需改更新源,无需改程序,见下)。 - 服务器不可达时回退到 GitHub Releases 接口;GitHub 回退只提示新版本并打开下载页,不自动安装(除非该 Release 附带了已签名的
versions.json)。 - 更换更新源的三种方式(优先级从高到低):
- 设置 → 关于 → 软件更新 → 更新源(填完整的
.../versions.json地址或站点地址,「恢复默认」清空)。 - 配置文件
%LOCALAPPDATA%\ClearDesk\update-source.json(其次是安装文件夹里的同名文件):{"sources":["https://example.com/versions.json"],"github":true}。 - 服务器侧:已签名的
versions.json里可带updateUrl(新的主地址)和mirrors(备用地址列表)。客户端只接受签名通过的清单里的这两个字段,并记住它们——所以将来换域名,只要在旧服务器上发布一次带updateUrl的签名清单,已安装的客户端就会自动迁移。
- 设置 → 关于 → 软件更新 → 更新源(填完整的
安全
- 更新包必须带 ECDSA P-256 / SHA-256 签名:
versions.json的signature签的是 版本号、文件名、大小、SHA-256、updateUrl、mirrors。公钥编译在 ClearDesk.exe 里,私钥只在发布者的电脑上,不会上传服务器、不进 Git、不进发布包。 - 因此即使服务器只有 http,中间人或被入侵的服务器也无法让客户端安装未经签名的程序;签名缺失、错误、版本号不比当前新(防回滚攻击)、大小或 SHA-256 不符,一律拒绝,并提示原因。
- 安装包自带
SHA256SUMS.txt,解压到暂存目录后逐个文件校验;拒绝路径穿越(..、绝对路径)、检查 ClearDesk.exe 的文件头和大小上限。 - 说明:http 下更新说明、发布日期不受签名保护(可能被篡改显示内容,但不影响安装什么);检查更新会向更新服务器发送一个普通 HTTP 请求(含 User-Agent
ClearDesk/版本号),不上传设置或文件信息。
替换过程与回滚
- 由一份临时目录里的 ClearDesk.exe(
--apply-update)执行:等待 ClearDesk、--guard守护进程和 TranslucentTB 退出(若上次异常退出导致任务栏仍被隐藏,先恢复)→ 先把旧文件改名为.cdold-*(正在使用的 DLL 也可以)再放入新文件,相同的文件跳过,ClearDesk.exe 和 SHA256SUMS.txt 最后替换 → 重新用原来的参数启动 → 观察 4 秒,若新版立即崩溃则自动回滚并重启旧版。 - 更新过程记录在
%LOCALAPPDATA%\ClearDesk\update\journal.json;更新中途断电或崩溃,下次启动会自动回滚。旧版本完整备份在%LOCALAPPDATA%\ClearDesk\update\backup\<旧版本>。 - 用户数据(
%LOCALAPPDATA%\ClearDesk下的设置、歌词缓存,以及安装文件夹里的update-source.json、startup-error.txt)不会被覆盖。 - 开机自启动:启动项指向的 ClearDesk.exe 路径不变(原地替换),更新后自启动继续有效。(2.0.9 的启动项自动修复仍在。)
- 安装文件夹不可写(例如装在
C:\Program Files)时,不会尝试提权,而是提示改为手动更新或把 ClearDesk 放到可写位置。从压缩包里直接运行时也不能在线更新。
局限
- 2.1.0 是第一个带更新功能的版本,2.0.9 及以前需要手动升级一次。
- 当前只有 http 下载;在备案和 https 就绪前,安全性依赖签名。
- 没有增量更新,每次下载完整 zip(约 6 MB)。
测试
Self:新增版本号比较(含预发布、构建元数据)、清单解析与签名载荷、签名校验(篡改、缺失、错误密钥)、SHA-256、更新源优先级、重定向与镜像、续传、包校验与路径穿越、替换顺序、回滚等检查。Regression:异步部分——本地 HTTP 服务模拟断点续传、重试、SHA-256/大小不符、GitHub 回退、对话框和设置页控件。- 端到端
scripts/test-update.ps1:用一次性密钥签名,在临时文件夹里复制一份 2.1.0,由本地测试服务器提供伪造的 2.1.1(同源码改版本号),真实走完 检查 → 下载(首个源不可达、下载中途被切断后续传)→ 验证 → 替换 → 重启;并验证:被篡改 / 未签名 / 回放旧版本的清单被拒绝、包内文件与校验表不符被拒绝、文件被占用导致替换失败时回滚、新版立即崩溃时回滚、updateUrl/mirrors重定向。脚本断言 HKCU 的 Run 启动项没有被改动,且不触碰任何真实安装文件夹。
发布者流程
scripts/publish-update.ps1(签名密钥由 scripts/new-update-key.ps1 生成一次):给定 zip 与更新说明,计算大小和 SHA-256,签名,生成 versions.json 和更新说明页面,打印上传命令。先上传 zip,最后上传 versions.json;用 -Verify http://服务器/ 复核线上清单的签名和 zip 的大小、哈希。
ClearDesk 2.0.9 发布说明
发布日期:2026-10-24
修复:开机自启动不生效
有用户反馈“登录后自动启动”开了也不启动。2.0.9 针对下面几种原因逐一处理(设置里的开关位置不变:设置 → 常规 → 登录后自动启动)。
| 原因 | 现象 | 2.0.9 的处理 |
|---|---|---|
| 启动项路径失效 | 升级时解压到新文件夹并删除/改名旧文件夹,启动项仍指向旧路径;设置里仍显示“已开启”,开机却没有任何反应 | 每次启动自动检查并改为当前这份;也会把指向更旧版本(如 1.9.1)的启动项更新到新版;缺引号、缺 --startup 的旧写法一并修正。已手动关闭的不会被重新打开 |
| 被 Windows / 安全软件禁用 | “设置 → 应用 → 启动”或任务管理器里把 ClearDesk 关了,注册表里的启动项还在,旧版仍显示开启 | 设置里显示“被 Windows 禁用”,旁边新增「启动应用设置」按钮,直接打开 Windows 启动应用页;在 ClearDesk 里重新勾选会同时解除禁用标记 |
| 从压缩包里直接运行 | 没解压就双击 zip 里的 ClearDesk.exe,程序在临时目录运行,重启后目录消失 | 此时无法开启自启动,并提示先解压到固定位置 |
| 下载标记 | GitHub 下载的 zip 解压后,文件带“来自 Internet”标记,登录时可能被 SmartScreen 等拦住 | 开启自启动或自动修复时,清除 ClearDesk 自己文件夹内文件的该标记 |
| 注册表被拦截 | 安全软件阻止或还原 Run 启动项 | 写入后回读校验,失败则改用“启动”文件夹快捷方式 |
| 登录时桌面尚未就绪 | 任务栏/桌面窗口还没创建好就启动 | 等待任务栏和桌面就绪(最多 30 秒,已就绪则不等待);工作目录固定为程序所在文件夹 |
| 重复启动 | 旧、新两个启动项同时存在时弹出“已在运行”或设置窗口 | 登录启动的重复实例静默退出 |
排查建议
- 把整个 zip 解压到固定位置(例如
D:\ClearDesk),从那里运行一次,再在设置里开启自启动。 - 设置里状态为“被 Windows 禁用”时,点「启动应用设置」,把 ClearDesk 打开。
- 失败原因会写入
%LOCALAPPDATA%\ClearDesk\errors.log和startup-error.txt。
测试
新增 tests/V209Tests.cs:路径解析(带空格/中文/环境变量)、临时目录识别、StartupApproved 状态位、写入与回读、被禁用状态、失效路径与旧版本修复、缺参数修复、已关闭不被重开、从临时目录拒绝开启、启动文件夹回退、下载标记清除、登录等待、设置页按钮。测试使用独立的临时注册表项,不改动真实的启动项。