NSIS脚本咨询:字体存在性检查与自定义字体注册实现方案
NSIS 字体安装解决方案
首先明确你之前代码的核心问题:
- 错误将
$FONT_DIR指向本地项目目录,而非系统默认字体目录(NSIS内置变量$FONTS对应C:\Windows\Fonts) - 未声明管理员权限,写入系统目录需要管理员权限才能执行
- 部分场景下未明确字体文件的源路径,导致复制操作找不到目标文件
- 字体注册后未通知系统刷新字体缓存
以下是可直接使用的完整实现方案:
前置准备
- 下载
FontName插件(用于注册字体),将FontName.dll放入NSIS安装目录的Plugins文件夹中 - 确保你的项目目录下有
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
相关产品推荐
相关产品推荐

