jiake
3rd June 2010 09:24 UTC
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?
Afrow UK
3rd June 2010 11:53 UTC
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
3rd June 2010 15:33 UTC
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!
Afrow UK
3rd June 2010 19:30 UTC
That's great. I will put it on the Wiki when it's back up (down at the moment).
Stu
Afrow UK
3rd June 2010 19:35 UTC
I just updated the function with a missing Push/Pop for $R2.
Stu
jiake
4th June 2010 12:46 UTC
Thanks, I have downloaded the new one.
Ok, more users may view it also on Wiki now.
jiake
19th June 2010 05:18 UTC
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
>