我注意到资源管理器列表视图中的“标题”列显示了我需要的确切字体名称字符串,因此我意识到可以通过使用< strong>
WindowsAPICodePack 库的win32 shell属性包装器检索字体文件的标题属性来轻松解决问题。
我知道我要求不使用第三方库的解决方案,但我几乎可以确定这并非比使用该库更理想的解决方案,因为...嗯,一致的替代方案似乎是自己实现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
键中),则唯一缺少的是在字符串末尾添加“(TrueType)”或“(OpenType)”。请注意,保留 HTML 标记。
System.Windows.Media.Fonts
中,您有SystemTypefaces
,它会返回所有已安装的字体。类似于System.Windows.Text.InstalledFontCollection
。这可以为您提供一些信息。从SystemTypefaces.TypeFace
对象中可以获取更多信息。请参阅TypeFace.TryGetGlyphTypeface(out [GlyphTypeface])
。(您需要首先实例化一个新的System.Windows.Media.GlyphTypeface
)。这将为您提供很多有用的信息,包括..\Windows\Fonts
字体文件 URI 和所有指标、许可证等。某些字体加粗权重的 花哨 名称只是铸造厂文件名。 - JimiMS.Internal.{}
类型)。 - JimiCultureInfo
检索本地化风格名称时,返回空值,您只会得到InvariantCulture
引用。您可以使用相同的过程从索引属性Win32FamilyNames
和Win32FaceNames
中获取信息。 - Jimi