如何获取文本字体文件的标题(而非名称)? (TTF和OTF)

时间:2018-11-03 18:12:44

标签: c# .net vb.net fonts true-type-fonts

问题

在C#或VB.NET中,在WinForms类库或WPF下,并且不需要第三方应用程序或API,我想知道如何以与显示的相同方式检索文本字体文件的标题。右键单击文本字体文件,然后转到details属性页。

换句话说,我需要获得Windows注册表中将注册字体的确切名称,该名称与为我提供System.Drawing.FontFamily.Name属性和System.Drawing.Font.Name属性的名称都不相同

RESEARCH

StackOverflow中有一些有关如何获取字体名称的问题,例如thisthis,而字体标题则没有。

没有什么可以帮助我。我将举一个区别的例子:

我有一个真正的字体文件,文件名为“ OpenSans-Light.ttf”,在详细信息属性页面中显示为“ Open Sans Light”,但是使用基于System.Drawing.FontFamily的解决方案,我得到了名称“无休假”。

然后,在我看到.NET Framework(WindowsForms)类库可能不提供获取字体标题的功能之后,我试图从Windows API中发现哪个功能可能正在使用Windows的Windows Shell扩展。文件详细信息属性表以获取字体标题...

...我什么也没找到,也没有信息,没有任何东西,只是GetFontData函数无法提供我所需的信息。

1 个答案:

答案 0 :(得分:2)

我注意到“资源管理器”列表视图中的“标题”列显示了所需的确切字体名称字符串,因此知道这一点,然后我意识到可以通过使用Win32 Shell属性包装器轻松解决该问题。 WindowsAPICodePack 库以检索字体文件的Title属性。

我知道我请求的解决方案没有第三方库,但是我几乎可以肯定,这不是比使用此库更理想的解决方案,因为...嗯,一致的替代方案似乎实现了Win32 shell自己包装财产。

示例代码:

Imports Microsoft.WindowsAPICodePack.Shell

Dim diInfo As New DirectoryInfo("C:\Fonts\")

For Each fiInfo As FileInfo In diInfo.GetFiles("*.ttf", SearchOption.TopDirectoryOnly)
    Dim sFile As ShellFile = ShellFile.FromFilePath(fiInfo.FullName)
    Dim title As String = sFile.Properties.System.Title.Value

    Dim sb As New StringBuilder()
    sb.AppendLine(String.Format("Name.: {0}", fiInfo.Name))
    sb.AppendLine(String.Format("Title: {0}", title))

    Console.WriteLine(sb.ToString())
Next

示例输出:

Name.: OpenSans LightItalic.ttf
Title: Open Sans Light Italic

Name.: OpenSans Light_0.ttf
Title: Open Sans Light

Name.: OpenSans-Bold.ttf
Title: Open Sans Bold

Name.: OpenSans-BoldItalic.ttf
Title: Open Sans Bold Italic

Name.: OpenSans-ExtraBold.ttf
Title: Open Sans Extrabold

Name.: OpenSans-ExtraBoldItalic.ttf
Title: Open Sans Extrabold Italic

Name.: OpenSans-Italic.ttf
Title: Open Sans Italic

Name.: OpenSans-Light.ttf
Title: Open Sans Light

Name.: OpenSans-LightItalic.ttf
Title: Open Sans Light Italic

Name.: OpenSans-Regular.ttf
Title: Open Sans

Name.: OpenSans-Semibold.ttf
Title: Open Sans Semibold

Name.: OpenSans-SemiboldItalic.ttf
Title: Open Sans Semibold Italic

唯一缺少的是如果确实需要与Windows注册表中显示的字符串完全相同的字符串,请在字符串的末尾添加“(TrueType)”或“(OpenType)”(在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts键中)。