Repository navigation
FontManager v2.1.6
FontManager 2.1.6
启动页放大一倍、安装器改由主程序自己画、蓝色压到不抢眼。这是 2.1.5 之后的一次
整包发布:启动页从 560×380 等比放大到 1120×760 且每次至少停留 1.5 秒(严格「先关启动页、
再显示主界面」);安装器 / 卸载器的界面不再用 NSIS 那套,改由fontmanager.exe --installer-ui
画,和主程序共用字体、主题与措辞;装/卸之前发现软件还开着会先问一句,不再出现「文件被占用」
或「卸完了程序还在」。当天还有两处是照着用户截图改的观感:安装器右栏那块品牌图和启动页深色主题的光晕都调淡
了(「蓝色浅一些,太抢眼了,不要影响用户看左边的内容」「不要看起来太脏」),安装进度屏
长时间不动的问题也一并修了(「等太久,我还以为卡了」)。说明:这一批改动在本地先后按 2.1.7 / 2.1.8 编过测试包,从未发布。对外只有这一条
2.1.5 → 2.1.6 的线,避免版本号跳空。
安装器 / 卸载器
- 屏 3「等太久以为卡了」(用户实测:卡在
正在登记卸载信息+已用 0 秒四十多秒):已用 N 秒改成前端每秒自己走,超过 20 秒追加「正在写入,请勿关闭窗口」。原来只在跳步时
刷新一次,装到某一步之后长时间没有事件,数字就冻在那儿——看着和死机没有区别。- 填充条加呼吸动画(
.prog i.running,1.6s 明暗,减动效时关闭):只动亮度,宽度和百分比不动。 - 覆盖安装不再假跳:
fontmanager.exe/uninstall.exe开局就在,原来第 0.1 秒就跳到 88%;
现在主程序只在"开局不存在"时算一步,卸载程序改用 mtime 变新判断。
- 右图整体降音量:底
#0a1550/#060e3a(L≈18%)→#1e2a63/#131a3f(L≈25%);右上角光斑
rgba(22,44,150,.55)/ 半径 60% →rgba(104,132,232,.17)/ 64%;圆点#3455f2 → #1429bb
一系 →#6b83e0 → #3f4ea6一系,投影.42→.34。 - 噪点
.13→.09:底色提亮后同一层颗粒在亮面上会显脏(与浅色主题那次「太暗太脏」同因)。 - 口径:降的是音量(面积 × alpha),不是纯度。实测把饱和度压到 42% 会发灰、发浑,
比鲜艳更廉价 —— 写进setup.css注释与规格书 §4.4,别再调回去。
主界面
- 设置弹窗字阶层级(用户:「最顶部的设置要比所有字体都大,要有大小和粗细对比」):
面板标题 16 → 20 / 650;分区标题(语言 / 系统 / 字体库)13 / 500 → 16 / 600 / 正体 / 主文字色;
行标签 14 / 500 不动;.settings-section之间补 4px。三档 20/650 → 16/600 → 14/500 尺寸与字重同时递进。
实现在app.css末尾追加段(删整段即回滚),规格书 §3.7 与变更记录已回写。
启动页
- 深色光晕改淡蓝:
rgba(27,54,196,.55)/ 68% →rgba(100,136,255,.26)/ 72%。原来是深宝蓝
铺满小半张卡,整块底看着像海军蓝;现在色相往浅里提、音量降下来、半径放大让它散开。 - 进度条新增
--sp-bar令牌:深色#3f5be0 → #6f8cff(原来#1230c8 → #2f6bff那段太沉),
浅色保持原宝蓝不变 —— 纸上淡蓝会糊成灰。四段主题块都已补上该令牌。 - 浅色主题的底色、光晕、轨道一个值都没动。
2.1.7 那一轮(放大一倍 / 最短 1.5 秒 / 串行交接)
- 整张卡等比放大一倍(用户要求「启动页扩大一倍」):560×380 → 1120×760,图标块 78→156
(内边距 9→18、阴影偏移 28/60/-16 同步放大)、名称 15→30、进度条 168×2→336×4、
状态行 10.5→21、副状态 9→18、页脚 9→18、光晕 320→640(blur6→12)。
唯一的例外是窗口圆角只到 24(不是 32):圆角属于窗口外壳而不是画面内容,等比成 32
会让四角圆得不像 Windows 窗口(主窗口 1280×820 用的也是小圆角)。 - 最少显示 1.5 秒(用户要求「字体太少导致启动页关闭太快,最少 1.5 秒」)。计时起点是
启动页真正 show 的那一刻,不是进程启动那一刻 —— 热缓存下字体 3 ms 就绪,按进程起点算
等于没显示。判据移到原生侧(lib.rs::SPLASH_MIN_SHOW),前端不再自己掐表:
原来App.tsx里那个SPLASH_MIN_MS = 600删掉了,免得两处各算一套。 - 严格串行交接(用户要求「启动页关闭后主界面再显示出来」):
splash_done改成
等淡出 190 ms →close splash→ 立刻show main,去掉原来「先 show 再 close」的 220 ms 重叠。 - 修掉「第二次启动没有启动页」:热启动时
splash_done会早于 splash 窗口创建,
那一刻还没记下显示时刻,于是直接放行(日志里启动后 1214ms)。现在先循环等建窗完成
(最多 2 秒,--minimized启动不等),拿到起点再补足 1.5 秒;复测3118/3206ms。 - 安装器完成页的「立即运行」也走启动页:它和手动双击是同一条启动路径(
spawn_detached),
不再有「从安装器点进来就没有启动页」这种分叉。
安装器 / 卸载器 · 路线 C(界面由主程序画)
- 界面搬到主程序里:
fontmanager.exe --installer-ui/--uninstall-ui起一个 1000×620
的独立窗口,画面来自setup.html+src/setup/(vanilla TS,不引 React,产物 33 KB)。
主 bundle 里搜不到任何一句安装器文案,也不引用setup-*.js。 - 引擎仍是 NSIS:界面只负责问与显示,点「安装」时它拉起
setup.exe /S /D=<目录>,
卸载时拉起uninstall.exe /S [/PURGE=1],然后核对结果(fontmanager.exe、uninstall.exe、
注册表DisplayVersion三样都在才算成功)。不重写第二套解包/注册表/白名单逻辑。 - 装/卸之前先问一句「软件还开着」:用 Toolhelp32 枚举进程 +
QueryFullProcessImageNameW
比对路径,只认同一安装目录下的fontmanager.exe(不会误伤别的地方的副本)。
命中就发setup:blocked事件、界面弹遮罩对话框:取消 / 关闭软件并继续。
选继续时逐个TerminateProcess并回报「请求 N 个,仍剩 M 个」。 - 取消要能被引擎识别:用户点「取消」直接关窗时,退出码原本恒为 0,NSIS 会当成「装好了」。
现在Ctx.ok区分「真装完」和「一进来就关掉」,在RunEvent::Exit里按 10 退出。
坑:App::run()结束后自己exit(0)且不返回,所以退出码和清理都只能挂在
RunEvent::Exit回调里 —— 写在run()之后等于没写。 - 卸载界面必须从
%TEMP%跑:NSIS 先把主程序拷到%TEMP%\FontManager-setup-ui再执行,
否则界面自己就是$INSTDIR\fontmanager.exe,uninstall.exe /S删不掉它,
用户看到的是「卸完了但程序还在」。 /S一律不弹界面:三条路径都带${Silent}守卫,静默安装/静默更新仍是真静默。
安装器 · 静默路径与选包
- WebView2 安装失败分支在
/S下会MessageBox等人点,而update.rs用
Start-Process -Wait等进程退出 → 无人值守的更新会永久挂死。现在该分支在静默下
直接走失败路径并显式SetErrorLevel。 - 显式写非 0 退出码,不再依赖 NSIS 未文档化的默认值(实测裸
Abort/Quit在/S下退 2,
不是 0,所以「静默失败被当成功」这个说法本身是错的;改它是为了把契约写死)。 - 选包 rank 补上版本号比较:此前只比「有没有 x64」,同架构的旧包可能被选中。
卸载 · 残留
- 图标文件与空目录:卸载后
snapshot-icon.ico/pack-icon.ico/data-icon.ico/
library-folder.ico以及plugins/字体库这些空壳会留在安装目录里。现在新增一段清理
($UpdateMode <> 1,与「删数据」无关),只删空目录(RMDir不带/r)——
用户往里放过东西就自动保留。 %TEMP%\FontManager-setup-webview(约 1.3 MB)用完没删。清理动作从run()之后挪到
RunEvent::Exit(原因同上),删不动就重试 3 秒。- 桌面快捷方式:勾选「创建桌面快捷方式」时给 NSIS 补一个
/DS参数。模板里
$NoShortcutMode在覆盖安装时会把「要快捷方式」直接短路掉,导致升级后桌面上没有图标。
工程
tools/route-c.mjs:路线 C 的开关就是installer.nsi里的一行!define。2.1.7 起默认开启,
CI 用--assert-on钉住(此前是--assert-off)。--assert-off保留给将来做 A/B 对比。tools/check-silent-paths.mjs:进 CI 的护栏,专拦「/S会执行的区段里没有${If} ${Silent}分流」
这类硬错误(页面回调里的 WARN 不阻断,/S下页面回调根本不跑)。docs/安装器与启动页-UI交付规格书.md:新增 §4.9「程序还在运行 · 确认对话框」、§5 全部数值
按 ×2 重写、§5.3 最短显示 600→1500 ms;docs/make-spec-html.py同步生成 HTML 版。- 与 ZFontManager 彻底脱钩(用户 2026-11-14:「这个软件和 ZFontManager 已经不一样了,不需要
兼容」):安装器hooks.nsh不再清理%APPDATA%\ZFontManager旧目录、HKCU 字体表也不再认
%APPDATA%\ZFontManager\前缀;主界面「关于」里「从 ZFontManager 0.8.0 迭代而来」那一行
连同 9 份 locale 的about.linksTitle键一起删掉(出处只保留在 LICENSE 的 0.8.0 版权声明,
GPL 要求仍满足)。副作用:极老机器上那份残留目录不会被卸载器顺手清掉了,需要手动删。
文档
docs/安装器与启动页-UI交付规格书.md§2.2 / §3.1 / §4.4 / §5.1 / §5.4 按实现回写,并清掉
2.1.7 之后遗留的「深林绿」口径(品牌色早已是宝蓝);docs/installer-splash-ui-demo.html
原型同步;规格书 HTML 由python docs/make-spec-html.py installer重新生成。
⚠️ 本版本未做代码签名
两个安装包目前没有数字签名,Windows 因此无法验证发布者。下载或安装时可能遇到下面两种提示,
都不是病毒告警,按说明处理即可。
1. 浏览器提示「通常不会下载」(Edge / Chrome 的下载保护)
点提示条右侧的「…」或「更多」,选择 保留 / 仍然下载。
2. Windows 11 智能应用控制(Smart App Control)提示「已阻止可能不安全的应用」
这个提示没有「仍要运行」按钮,只有两个选择:
- 点「正常」关闭提示,按下面的方式验证文件完整性后自行决定是否继续;
- 或在「设置 → 隐私和安全性 → Windows 安全中心 → 应用和浏览器控制 → 智能应用控制」里
关闭该功能。注意:智能应用控制一旦关闭,通常无法再次开启(需重置或重装系统),
请自行权衡,不建议为装一个软件长期关掉系统防护。
验证文件完整性(推荐,用来确认下载没被篡改):
Get-FileHash .\FontManager_2.1.6_x64-setup.exe -Algorithm SHA256把输出与下方 SHA-256 对照,一致即说明文件完整。
本项目是个人维护的免费开源项目,没有购买代码签名证书,详见仓库根目录的
CODE_SIGNING_POLICY.md。
下载
| 文件 | 说明 |
|---|---|
FontManager_2.1.6_x64-setup.exe |
NSIS 安装包,推荐(同版本号可覆盖安装,装到当前用户目录,不需要管理员权限) |
FontManager_2.1.6_x64_en-US.msi |
MSI 安装包(同一版本号的 MSI 无法覆盖安装,升级请用 setup.exe) |
setup.exe:装到%LOCALAPPDATA%\FontManager,普通用户双击即可,同版本可直接覆盖重装。.msi:装到Program Files,需要管理员权限,适合域内 GPO / Intune / SCCM 静默推送:
msiexec /i FontManager_2.1.6_x64_en-US.msi /qn。
⚠️ 两个安装器共用注册表项HKCU\Software\IIEOzo\FontManager记录安装目录,
裸.msi只在干净机器上用;已经装过 setup.exe 的机器请继续用 setup.exe。
1.5.5起发布者署名改为IIEOzo,该键路径随之变化;若你曾自定义安装目录,
建议先卸载旧版(不要勾选「删除全部数据」)再安装本版,用户数据不会丢。
插件运行时(普通用户不用下)
python-runtime.zip / node-runtime.zip 是插件系统用的可选运行时。插件面板点「补全运行时」
时,程序从本 Release 的 latest/download/<kind>-runtime.zip 拉取,所以这两个包必须一起上传。
不装插件的话完全用不到,不必下载。
SHA-256:
d6836f5743cccf72451261863f64e0c0544533445a1191050d9d2774ffaf4671 FontManager_2.1.6_x64-setup.exe
18895969eb0f6294cbeea6c7f24e46efd12e6df4f544aa864293fe3f1f02c58d FontManager_2.1.6_x64_en-US.msi
安装
| 文件 | 大小 | 说明 |
|---|---|---|
FontManager_2.1.6_x64-setup.exe |
6.3 MB | 推荐。NSIS 安装器,装到 %LOCALAPPDATA%\FontManager,不需要管理员权限 |
FontManager_2.1.6_x64_en-US.msi |
8.5 MB | MSI 版,perMachine 安装需要提权 |
python-runtime.zip / node-runtime.zip |
20.4 / 34.4 MB | 插件运行时,按需下载,首次启用插件时软件自己去取 |
覆盖安装即可升级,字体库、分组、快照、设置都保留。
校验(SHA-256)
d6836f5743cccf72451261863f64e0c0544533445a1191050d9d2774ffaf4671 FontManager_2.1.6_x64-setup.exe
18895969eb0f6294cbeea6c7f24e46efd12e6df4f544aa864293fe3f1f02c58d FontManager_2.1.6_x64_en-US.msi
8bfa6dcce3b06f2bf37ee6b3505cb4e16ed716e68bdc3bee526362139349b8b7 node-runtime.zip
14d4eb82d553879baee8a78c92be341f9b5c145c8cd466c441aa834af21a084f python-runtime.zip
已知差异(不是 bug):安装耗时约 40–60 秒,主要花在解压 24 MB 主程序与杀毒软件扫描上;进度条只能按「主程序落盘 / 卸载器生成 / 引擎退出」三档推,中间会有几十秒不动,但计时器与呼吸条会告诉你它还在干活。