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

Uno*_*ome 5 c# winapi fonts

我正在使用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));
}
Run Code Online (Sandbox Code Playgroud)

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

如果函数成功,则返回值指定添加的字体数.

如果函数失败,则返回值为零.没有可用的扩展错误信息.

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

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

但是该isFontInstalled函数总是返回false.

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

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

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

根据文件:

此函数仅为当前会话安装字体.系统重新启动时,字体将不存在.要在重新启动系统后安装字体,必须在注册表中列出该字体.

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

Nat*_*271 3

根据RemoveFontResourceA函数的文档

如果函数成功,则返回值非零。

如果函数失败,返回值为零。

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

希望有帮助。