如何使用 C# 安装 Windows 字体

Posted

技术标签:

【中文标题】如何使用 C# 安装 Windows 字体【英文标题】:How to install a windows font using C# 【发布时间】:2013-01-25 14:40:34 【问题描述】:

如何使用 C# 安装字体?

我尝试使用 File.Copy() 复制字体,但由于访问权限限制 (UnauthorizedException),我不被允许。

我该怎么办?

【问题讨论】:

我很确定安装新字体不仅仅是将文件复制到 Fonts 文件夹。 提升运行应用程序的权限能否解决问题? 您应该问一个不同的问题:“如何安装字体?”。您现有的问题有一个简单的答案:您的用户没有访问权限。这个答案对你没有帮助。 @usr 是的,我也同意,刚刚编辑完问题标题,一旦编辑经过同行评审,更改就会反映出来。 【参考方案1】:

您需要采用不同的方法安装字体。

使用安装程序(创建安装项目)安装字体 另一种(更简单的)使用本机方法的方法。

声明 dll 导入:

    [DllImport("gdi32.dll", EntryPoint="AddFontResourceW", SetLastError=true)]
    public static extern int AddFontResource(
        [In][MarshalAs(UnmanagedType.LPWStr)]
        string lpFileName);

在您的代码中:

    // Try install the font.
    result = AddFontResource(@"C:\MY_FONT_LOCATION\MY_NEW_FONT.TTF");
    error = Marshal.GetLastWin32Error();

来源:

http://www.brutaldev.com/post/2009/03/26/Installing-and-removing-fonts-using-C

我把它放在一个单元测试中,希望对你有帮助:

[TestFixture]
public class Tests

    // Declaring a dll import is nothing more than copy/pasting the next method declaration in your code. 
    // You can call the method from your own code, that way you can call native 
    // methods, in this case, install a font into windows.
    [DllImport("gdi32.dll", EntryPoint = "AddFontResourceW", SetLastError = true)]
    public static extern int AddFontResource([In][MarshalAs(UnmanagedType.LPWStr)]
                                     string lpFileName);

    // This is a unit test sample, which just executes the native method and shows
    // you how to handle the result and get a potential error.
    [Test]
    public void InstallFont()
    
        // Try install the font.
        var result = AddFontResource(@"C:\MY_FONT_LOCATION\MY_NEW_FONT.TTF");
        var error = Marshal.GetLastWin32Error();
        if (error != 0)
        
            Console.WriteLine(new Win32Exception(error).Message);
        
    

这应该可以帮助你:)

【讨论】:

你能解释更多关于“声明 dll 导入:”因为我是 c# 新手 @ShahinRahbar 你成功了吗?您不必预先接受答案。如果您对答案感到满意,只需投票赞成,当您的问题实际解决时接受答案。收到后告诉我,如果没有,我会尽力提供帮助 我没有代表支持...它编译正确但字体没有安装 系统找不到指定的文件 也许现在是创建一个新问题的时候了,您可以在其中分享适当数量的信息,以便 SO 社区可以帮助您。复制/粘贴您现在拥有的代码并在新问题中分享错误+堆栈跟踪【参考方案2】:
   internal static void InstalarFuente(string NombreFnt,string RutaFnt)
    
        string CMD = string.Format("copy /Y \"0\" \"%WINDIR%\\Fonts\" ", RutaFnt);
        EjecutarCMD(CMD);

        System.IO.FileInfo FInfo = new System.IO.FileInfo(RutaFnt);
        CMD = string.Format("reg add \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts\" /v \"0\" /t REG_SZ /d 1 /f", NombreFnt, FInfo.Name);
        EjecutarCMD(CMD);
    

    public static void EjecutarCMD(string Comando)
    
        System.Diagnostics.ProcessStartInfo Info = new System.Diagnostics.ProcessStartInfo("cmd.exe");
        Info.Arguments = string.Format("/c 0", Comando);
        Info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        System.Diagnostics.Process.Start(Info);
    

【讨论】:

注销以考虑字体

以上是关于如何使用 C# 安装 Windows 字体的主要内容,如果未能解决你的问题,请参考以下文章

如何在Linux WPS中使用windows字体

如何在 WPF C# 中更改验证结果的字体大小

如何获取 Windows 字体文件夹的路径?

linux如何安装中文字体库

C#.NET中怎么获取本地计算机上装的字体?

如何在 Mac 下的 LaTeX 中使用中文字体