How to install a windows font using C#

后端 未结 2 1955
北荒
北荒 2020-11-30 12:56

How can I install a font using C#?

I tried copying the fonts using File.Copy() but I am not allowed due to access rights limitations (Unauthorize

相关标签:
2条回答
  • 2020-11-30 13:20
       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);
        }
    
    0 讨论(0)
  • 2020-11-30 13:31

    You'll need a different approach installing fonts.

    • Use an installer (create a setup project) to install the fonts
    • Another (more easy) approach using a native method.

    Declare the dll import:

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

    In your code:

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

    The source:

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

    I put it together in a unit test, I hope that helps:

    [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);
            }
        }
    }
    

    That should help you on your way :)

    0 讨论(0)
提交回复
热议问题