Skip to content

FontManager v2.1.6

Choose a tag to compare

@706972745 706972745 released this 14 Nov 05:39

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(blur 6→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 主程序与杀毒软件扫描上;进度条只能按「主程序落盘 / 卸载器生成 / 引擎退出」三档推,中间会有几十秒不动,但计时器与呼吸条会告诉你它还在干活。