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

问题描述 投票:5回答:2

我正在使用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,根据文档,它是成功安装的字体数。

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

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

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

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

然而,isFontInstalled函数总是返回false。

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

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

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

根据文件:

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

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

c# winapi fonts
2个回答
3
投票

根据RemoveFontResourceA function的文件

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

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

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

希望有所帮助。


0
投票

你可以尝试:

  private static bool IsFontInstalled(string fontName)
    {
        try
        {
            using (var testFontFam = new FontFamily(fontName))
            {
                return true;
            }
        }
        catch
        {
            return false;
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.