You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NSIS脚本咨询:字体存在性检查与自定义字体注册实现方案

NSIS 字体安装解决方案

首先明确你之前代码的核心问题:

  • 错误将$FONT_DIR指向本地项目目录,而非系统默认字体目录(NSIS内置变量$FONTS对应C:\Windows\Fonts)
  • 未声明管理员权限,写入系统目录需要管理员权限才能执行
  • 部分场景下未明确字体文件的源路径,导致复制操作找不到目标文件
  • 字体注册后未通知系统刷新字体缓存

以下是可直接使用的完整实现方案:

前置准备

  1. 下载FontName插件(用于注册字体),将FontName.dll放入NSIS安装目录的Plugins文件夹中
  2. 确保你的项目目录下有Fonts子文件夹,存放所有需要安装的.ttf字体文件

完整NSIS脚本

; 声明管理员权限,必须项:写入系统目录需要权限
RequestExecutionLevel admin

; 引入必要的宏和插件
!include "FontName.nsh"
!include "FileFunc.nsh"

; 打包字体文件到安装包
Section "打包字体"
    SetOutPath "$INSTDIR\Fonts"
    File "Fonts\*.ttf" ; 打包本地项目Fonts目录下的所有字体
SectionEnd

; 核心字体安装逻辑
Section "安装系统字体" SEC_FONTS
    ; 指向系统默认字体目录
    StrCpy $FONT_DIR $FONTS

    ; 遍历安装包内的所有.ttf字体
    ${ForEachFile} "$INSTDIR\Fonts\*.ttf" $FontFile
        ; 检查字体是否已存在于系统目录
        IfFileNotExists "$FONT_DIR\$FontFile" +3
            MessageBox MB_OK "字体 $FontFile 已存在,跳过安装"
            Goto NextFont

        ; 复制字体到系统目录
        CopyFiles /SILENT "$INSTDIR\Fonts\$FontFile" "$FONT_DIR\"
        ; 注册字体到系统注册表
        FontName::InstallFont "$FONT_DIR\$FontFile"
        Pop $0 ; 获取注册结果,0为成功,非0为错误码
        ${If} $0 != 0
            MessageBox MB_OK "字体 $FontFile 注册失败,错误码: $0"
        ${EndIf}

        NextFont:
    ${NextFile}

    ; 发送广播消息,通知系统刷新字体缓存
    SendMessage ${HWND_BROADCAST} ${WM_FONTCHANGE} 0 0 /TIMEOUT=5000
SectionEnd

关键逻辑说明

  • 权限控制:RequestExecutionLevel admin确保安装程序以管理员身份运行,否则无法写入C:\Windows\Fonts
  • 目录指向:使用NSIS内置变量$FONTS直接获取系统字体目录,避免手动路径配置错误
  • 存在性检查:通过IfFileNotExists跳过已安装的字体,避免重复操作
  • 字体注册:FontName::InstallFont会将字体信息写入系统注册表,确保系统能识别该字体
  • 缓存刷新:SendMessage ${HWND_BROADCAST} ${WM_FONTCHANGE}让系统立即更新字体列表,无需重启

内容的提问来源于stack exchange,提问作者Kamal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:34:51