Skip to content
⌘ 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

Attachments

jiakeedited #
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 ?