我的最终目标是列出 Windows 计算机上的所有活动字体。例如,如果您启动 WordPad 或 Word,您将看到它们全部。其中一些字体来自 windows\fonts 文件夹,但不是全部。有些是使用 gdi32.dll 调用 AddFontResource(...) 动态注册的。现在,您会认为 C# 支持检索整个列表,如果是这样,请告诉我!
但是,在为此花费大量时间之后,用于获取已安装系统字体的常规 C# 调用只会检索所有实际处于活动状态的字体中的一部分。例如,InstalledFontCollection.Families 没有找到任何使用 AddFontResource 添加的字体(它找到了写字板中列出的大约 25% 的字体!)
虽然我想在 C# 中执行此操作,但似乎我必须使用更多 gdi32.dll 调用。因此开始了我的 EnumFontFamiliesEx 问题。
我已经设法使以下代码工作到我收到一堆带有字体的回调的程度。但是,结构 ENUMLOGFONTEX 似乎已损坏,例如 lpelfe.elfFullName 通常包含几个方形字符,从来没有真正的名字。也许我在编组或结构定义中犯了一个错误,不太确定。我尝试了许多迭代和无休止的谷歌搜索,但无济于事。
任何帮助将不胜感激。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Media;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace FontRetriever
{
public partial class TestForm : Form
{
[DllImport("gdi32.dll")]
static extern int EnumFontFamiliesEx(IntPtr hdc,
[In] IntPtr pLogfont,
EnumFontExDelegate lpEnumFontFamExProc,
IntPtr lParam, …Run Code Online (Sandbox Code Playgroud) 自学 VB hack,只有一点 .net 经验。我发现的关于这个主题的大多数帖子都相当老了,所以在我开始探索任何一个特定的兔子洞之前,我正在寻找最好的方向,并确保没有遗漏任何新的东西。
我在 vb.net 中编写了一个加载和卸载字体的应用程序。我正在读取注册表以查看加载了哪些字体,直接从字体文件读取字体信息,并使用 AddFontResource、RemoveFontResource 并修改注册表以在计算机重新启动时进行操作。
所有这些都有效,但正如这篇精明的文章所指出的,仅仅因为它在注册表中并不意味着它正在枚举。我们将生产字体存储在网络驱动器上,而 Windows 10 在重新启动/登录后重新连接时表现很糟糕,因此我做了相当多的研究来枚举所有加载的字体,令人惊讶的是,似乎没有任何东西这很容易工作。
EnumFontFamiliesEx API 的使用对我来说几乎令人难以置信(只是由于我缺乏知识),甚至我下载的代码也运行得相对较好,但无法获取某些加载的字体。与该链接的OP相同,我还没有弄清楚为什么,至少现在还没有。我已按照此处的建议修改了下载的代码以使用 EnumFontFamiliesExW API ,但仍然缺少字体。
这篇文章提出了一个叫做 DirectWrite 的东西,我认为它是 DirectX 的一部分?在看了一些之后,挫败感让我来到了这里。
所以我想有两个问题:
(大事)有比 EnumFontFamiliesExW 更新的东西吗?
对于 OTF 和 TTF 字体,我正在阅读“Typgraphic Family name”(此处定义的 ID 16 )(当它可用时),因为这就是 Adobe 产品显示的内容。使用 EnumFontFamiliesExW 是否可以读取此 ID?我没有看到任何表明它是的。
哎呀,抱歉这么久,感谢您阅读到这里!