Archive: Can I get font name Using API ?


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:
http://www.undocprint.org/winspool/getfontresourceinfo

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?


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


Originally posted by 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
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:
http://forums.winamp.com/attachment....chmentid=47066

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!

That's great. I will put it on the Wiki when it's back up (down at the moment).

Stu


I just updated the function with a missing Push/Pop for $R2.

Stu


Thanks, I have downloaded the new one.
Ok, more users may view it also on Wiki now.


Posted: http://nsis.sourceforge.net/Get_localised_font_name

Stu


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
>