4

我正在尝试使用下面的代码使用 C# 代码安装字体。

调用 InstallFont 不会抛出任何异常并返回 1。我认为这表明它已经安装了字体。但是,该字体不会出现在 Windows Fonts 文件夹中或检查 InstalledFontCollection 时的已安装字体列表中,也不会显示在我的软件中。我尝试安装后重新启动计算机,但仍然不可用。

如果我通过双击 Windows 资源管理器并单击安装来手动安装文件,则字体安装没有问题。

我在 Windows 7 64 位操作系统上使用 C#、Visual Studio 2010、Microsoft .NET Framework 4.0。

任何帮助将不胜感激。

非常感谢,保罗

清单文件包括:

requestedExecutionLevel level="requireAdministrator" uiAccess="false"

申请代码:

[DllImport("user32.dll")]
public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);
[DllImport("gdi32.dll", EntryPoint = "AddFontResourceW", SetLastError = true)]
public static extern int AddFontResource([In][MarshalAs(UnmanagedType.LPWStr)] string lpFileName);

public static int InstallFont()        
{
    InstalledFontCollection ifc = new InstalledFontCollection();

    if (ifc.Families.Any(item => item.Name == "Arial Narrow"))
        return 100; // Font already installed

    string filename = @"C:\Users\username\Downloads\ARIALN.TTF";

    const int WM_FONTCHANGE = 0x001D;
    const int HWND_BROADCAST = 0xffff;

    int added = AddFontResource(filename);
    SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

    return added;
}
4

1 回答 1

7

请务必查看有关 AddFontResource() 的 MSDN 库文章:

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

InstalledFontCollection 类仅枚举实际安装的字体并忽略临时字体。编写注册表项并将文件复制到 c:\windows\fonts 是安装程序的一项职责。除了通过控制面板小程序访问之外,Microsoft 没有记录如何执行此操作。如果你想试一试,注册表项是 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts

于 2012-11-23T13:49:39.230 回答