Skip to content
⌘ NSIS Forum Archive

Can I get font name Using API ?

9 posts

jiake#

Can I get font name Using API ?

Last time I post a thread about the FontName plugin. I said that the plugin can only get the English name of the font. I used to contact the author, but the plugin is built in 2007, I thought it is not easy to contact to him. Later I search in internet, someone said that a win32 API could get the infomation of a font file.

This is an article about the funtion:


I tried to use it, but I didn't get the result as my programming is poor. Would you help me to write an example script to show the usage?
Afrow UK#
Nice find. I'm not sure if it gets exactly what you need but here you go anyway (see attached script). Tested on Windows 7 (Verdana.ttf -> Verdana).

Stu
jiake#edited
Originally Posted by Afrow UK View Post
Nice find. I'm not sure if it gets exactly what you need but here you go anyway (see attached script). Tested on Windows 7 (Verdana.ttf -> Verdana).

Stu
Thanks a lot!
I test your script like this:
  Push simsun.ttc
  Call GetFontName
  Pop $R0
  DetailPrint $R0
  Push simhei.ttf
  Call GetFontName
  Pop $R0
  DetailPrint $R0 
It exactly prints the Chinese font name:


When I have a lot of TTF fonts to install, I must write to registry for every font file before, for the FontName plugin only got the English names. But now, I can easily inst any TTF fonts in custom folder by using a macro. This function is not only useful to me, but also to more users from different contries. Thank you again!
jiake#
Recently, I found that I get only "error" when using this code. I found that, I tried to "push" a installed font file name, it returned the correct name, but when I "push" a file name that is not yet installed, it always returned "error". At the beginning I donot know why, later I imagine that the font resource must be added to system first, actually that's it.

So, to install a font, you must insert this line before get its name and write to registry:
System::Call "gdi32::AddFontResource(t 'FontFileName')"

ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "CurrentVersion"
IfErrors Win9x WinNT
Win9x:
StrCpy $FONTREGKEY "Software\Microsoft\Windows\CurrentVersion\Fonts"
Goto RegFont
WinNT:
StrCpy $FONTREGKEY "Software\Microsoft\Windows NT\CurrentVersion\Fonts"
Goto RegFont
RegFont:
ClearErrors
!macro InstFont FONTFILE
        System::Call "gdi32::AddFontResource(t '${FONTFILE}')"
        Push '${FONTFILE}'
        Call GetFontName
        Pop $R0
        ${If} $R0 != 'error'
            WriteRegStr HKLM '$FONTREGKEY' '$R0 (TrueType)' '${FONTFILE}'
        ${Else}
            System::Call "gdi32::RemoveFontResource(t '${FONTFILE}')"
        ${EndIf}
!macroend
FindFirst $0 $1 '$INSTDIR\TrueType\*.ttf'
loop:
        StrCmp $1 "" done
        !insertmacro InstFont '$INSTDIR\TrueType\$1'
        FindNext $0 $1
        Goto loop
done:
SendMessage ${HWND_BROADCAST} ${WM_FONTCHANGE} 0 0 
stass#
If you change the name of the font file, the code is not working ...
( For example, if I change the file name to the arial.ttf - arial1.ttf - I get an error. )

We need to get a real Font name, regardless of the name of the font file...
How to do it?

ps
Please tell me - a syntax for the plugin FontName plug-in ? The documentation does not even have examples of ...
!insertmacro FontName "MyFontFile.ttf"
How to get out of here the name of the font ?