C# · 12月 21, 2021

c# – 如何使用AddFontResource()安装的字体以编程方式?

我正在使用AddFontResource函数在本地为当前登录会话安装字体.

private void installFont(string fontPath){ IntPtr HWND_BROADCAST = new IntPtr(0xFFFF); const int WM_FONTCHANGE = 0x1D; string fontLocation = Environment.ExpandEnvironmentVariables(fontPath); int result = AddFontResourceA(fontLocation); //This is currently printing Number of Fonts Installed = 1 Console.WriteLine(“Number of Fonts Installed = ” + result); SendMessage(HWND_BROADCAST,WM_FONTCHANGE); PrivateFontCollection fontCol = new PrivateFontCollection(); fontCol.AddFontFile(fontLocation); var actualFontName = fontCol.Families[0].Name; Console.WriteLine(“Font Installed? = ” + IsFontInstalled(actualFontName));}

AddFontResource函数返回的int结果是1,根据文档,它是成功安装的字体数.

If the function succeeds,the return value specifies the number of
fonts added.

If the function fails,the return value is zero. No extended error
information is available.

然后我使用以下代码以编程方式测试字体.

private static bool IsFontInstalled(string fontName){ using (var testFont = new Font(fontName,8)) { return fontName.Equals(testFont.Name,StringComparison.InvariantCultureIgnoreCase); }}

但是,isFontInstalled函数始终返回false.

此函数运行一个简单的测试,它尝试使用已安装的字体名称创建一个Font.如果安装成功,新字体将具有所使用字体的名称,如果未安装,则默认为不同的系统字体名称.

注意我认识到我目前以编程方式验证字体安装的实现可能不适用于所有情况,请随意提出更好的验证方法,我假设部分问题可能是我当前的实现仅用于验证使用注册表中.

我使用相同的函数来测试我是否安装了通过注册表安装的字体,它是否按预期工作.有关如何使用显然安装的字体的任何见解?

根据文件:

This function installs the font only for the current session. When the
system restarts,the font will not be present. To have the font
installed even after restarting the system,the font must be listed in
the registry.

根据我的理解,当前会话将持续到用户注销,并且应该包括该程序的测试功能.最佳答案根据RemoveFontResourceA function的文档

If the function succeeds,the return value is nonzero.

If the function fails,the return value is zero.

我创建了一个快速应用程序,我在有效字体上使用AddFontResource添加了一个字体,然后在相同的有效字体上调用了RemoveFontResource,返回了非零退出代码.然后我做了相反的事情并使用AddFontResource添加了一个伪造的字体,并且RemoveFontResource返回了一个0退出代码.您可以使用它来验证字体是否实际安装,如果它成功卸载,只需让验证方法重新安装该字体.

希望有所帮助.