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

How to get the title (not the name) of a text font file? (TTF and OTF)

问题

在 C# 或 VB.NET 中,在 WinForms class 库或 WPF 下,不需要第 3 方应用程序或 APIs,我想知道如何检索标题文本字体文件,与右键单击文本字体文件并转到详细信息 属性 页面时显示的方式相同。

换句话说,我需要获取字体将在 Windows 注册表中注册的确切名称,该名称与给我 System.Drawing.FontFamily.Name [=46] 的名称不同=] 既不是 System.Drawing.Font.Name 属性.

研究

Whosebug 中有一些关于如何获取字体名称的问题,例如 this and this,但 none 用于字体标题。

这些都帮不了我。我将举例说明区别:

我有一个文件名为 "OpenSans-Light.ttf" 的 True Type 字体文件,在详细信息 属性 页面中显示为 "Open Sans Light",但使用的是基于 System.Drawing.FontFamily 的解决方案我知道名字 "Open Sans".

然后,在我看到 .NET Framework (WindowsForms) class 库没有提供获取字体标题的功能后,我试图从Windows API 可以使用文件详细信息的 windows shell 扩展名 属性 sheet 来获取字体标题...

...我什么也没找到,没有任何信息,什么都没有,只有 GetFontData 函数没有提供我需要的信息。

我注意到 Explorer 列表视图中的 "Title" 列显示了我需要的确切字体名称字符串,因此知道这一点后,我意识到使用 win32 shell 属性 WindowsAPICodePack 库的包装器,用于检索字体文件的标题 属性。

我知道我请求了一个没有第 3 方库的解决方案,但是我几乎可以肯定它不会是比使用这个更理想的解决方案,因为......好吧,一致的替代方案似乎实现了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 注册表中显示的完全相同的字符串(在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts键)。