Как установить шрифт windows с помощью C#
Как установить шрифт с помощью C#?
Я пытался скопировать шрифты с помощью File.Copy()
, но мне это не разрешено из-за ограничений прав доступа (UnauthorizedException
).
Что мне делать?
2 ответа:
Вам потребуется другой подход к установке шрифтов.
- Используйте установщик (создайте проект установки) для установки шрифтов
- другой (более простой) подход с использованием собственного метода.
Объявите импорт 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); } } }
Что должен помочь вам на вашем пути:)
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); }