NSIS 基本字体安装/卸载,需要用到头文件 FontInstall.nsh
FontInstall.nsh:
!include LogicLib.nsh
!include WinMessages.nsh
!macro FontInstallHelper FontFileSrc FontFileDst FontInternalName Resource RegSuffix RegRoot
ClearErrors
!if "${FontFileSrc}" != ""
${IfNot} ${FileExists} "${FontFileDst}"
File "/oname=${FontFileDst}" "${FontFileSrc}"
${EndIf}
!endif
${IfNot} ${Errors}
Push $0
Push "${Resource}"
Exch $1
Push "${FontInternalName}${RegSuffix}"
Exch $2
Push $9
StrCpy $9 "Software\Microsoft\Windows NT\CurrentVersion\Fonts"
!if "${NSIS_CHAR_SIZE}" < 2
ReadRegStr $0 ${RegRoot} "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "CurrentVersion"
${IfThen} $0 == "" ${|} StrCpy $9 "Software\Microsoft\Windows\CurrentVersion\Fonts" ${|}
!endif
System::Call 'GDI32::AddFontResource(tr1)i.r0'
${If} $0 <> 0
WriteRegStr ${RegRoot} "$9" "$2" "$1"
${Else}
SetErrors
${EndIf}
Pop $9
Pop $2
Pop $1
Pop $0
${Else}
SetErrors
${EndIf}
!macroend
!macro FontInstallTTF FontFileSrc FontFileName FontInternalName
!insertmacro FontInstallHelper "${FontFileSrc}" "$Fonts\${FontFileName}" "${FontInternalName}" "${FontFileName}" " (TrueType)" HKLM
!macroend
!macro FontUninstallHelper FontFileDst FontInternalName Resource RegSuffix RegRoot
System::Call 'GDI32::RemoveFontResource(t"${Resource}")'
DeleteRegValue ${RegRoot} "Software\Microsoft\Windows NT\CurrentVersion\Fonts" "${FontInternalName}${RegSuffix}"
!if "${NSIS_CHAR_SIZE}" < 2
DeleteRegValue ${RegRoot} "Software\Microsoft\Windows\CurrentVersion\Fonts" "${FontInternalName}${RegSuffix}"
!endif
ClearErrors
Delete "${FontFileDst}"
!macroend
!macro FontUninstallTTF FontFileName FontInternalName
!insertmacro FontUninstallHelper "$Fonts\${FontFileName}" "${FontInternalName}" "${FontFileName}" " (TrueType)" HKLM
!macroend
如果知道字体内部名称,可以使用硬编码名称安装,否则请使用 FontInfo 插件动态获取字体名称安装。
示例:
RequestExecutionLevel Admin
!include "FontInstall.nsh"
Section
StrCpy $1 0
; 硬编码名称安装
insertmacro FontInstallTTF "D:\Project\MyFoot.ttf" "MyFoot.ttf" "MyFoot Regular" ; MyFoot Regular 为字体内部名称,字体路径为本机路径而非客户机路径!
${IfNotThen} ${Errors} ${|} IntOp $1 $1 + 1 ${|}
; 使用插件动态获取名称安装
InitPluginsDir
File "/oname=$PluginsDir\MyFoot.ttf" "D:\Project\myfiles\MyFoot.ttf"
FontInfo::GetFontName "$PluginsDir\MyFoot.ttf"
${If} $0 != ""
!insertmacro FontInstallTTF "D:\Project\MyFoot.ttf" "MyFoot.ttf" $0
${IfNotThen} ${Errors} ${|} IntOp $1 $1 + 1 ${|}
${EndIf}
; 字体成功安装
${If} $1 <> 0
DetailPrint "已成功安装$1字体..."
SendMessage ${HWND_BROADCAST} ${WM_FONTCHANGE} 0 0 /TIMEOUT=5000
${EndIf}
SectionEnd
Section Uninstall
StrCpy $1 0
; 硬编码名称卸载
!insertmacro FontUninstallTTF "MyFoot.ttf" "MyFoot Regular"
${IfNotThen} ${Errors} ${|} IntOp $1 $1 + 1 ${|}
; 使用插件动态获取名称卸载
FontInfo::GetFontName "$Fonts\MyFoot.ttf"
${If} $0 != ""
!insertmacro FontUninstallTTF "MyFoot.ttf" $0
${IfNotThen} ${Errors} ${|} IntOp $1 $1 + 1 ${|}
${EndIf}
; 字体成功卸载
${If} $1 <> 0
DetailPrint "已成功卸载$1字体..."
SendMessage ${HWND_BROADCAST} ${WM_FONTCHANGE} 0 0 /TIMEOUT=5000
${EndIf}
SectionEnd
文章评论