Как установить шрифт Windows с помощью C#

Как я могу установить шрифт с помощью С#?

Я попытался скопировать шрифты с помощью File.Copy(), но мне это не разрешено из-за ограничений прав доступа (UnauthorizedException).

Что я должен делать?


person Shahin Rahbar    schedule 10.02.2013    source источник
comment
Я почти уверен, что установка новых шрифтов включает в себя нечто большее, чем просто копирование файлов в папку Fonts.   -  person dtb    schedule 10.02.2013
comment
Решает ли проблему повышение привилегий, под которыми работает приложение?   -  person abatishchev    schedule 10.02.2013
comment
Вы должны задать другой вопрос: Как установить шрифт?. На ваш существующий вопрос есть тривиальный ответ: у вашего пользователя нет прав доступа. Этот ответ вам не поможет.   -  person usr    schedule 10.02.2013
comment
@usr да, я тоже согласен, только что закончил редактировать заголовок вопроса, изменения отразятся после рецензирования.   -  person Baljeetsingh    schedule 10.02.2013


Ответы (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-demoving-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);
        }
    }
}

Это должно помочь вам в пути :)

person bas    schedule 10.02.2013
comment
Можете ли вы объяснить больше об объявлении импорта dll: потому что я новичок в С# - person Shahin Rahbar; 10.02.2013
comment
@ShahinRahbar у тебя уже получилось? Вам не нужно было принимать ответ заранее. Просто проголосуйте за ответ, если он вас устраивает, примите ответ, когда ваш вопрос действительно будет решен. Просто дайте мне знать, когда вы его получите, если нет, я постараюсь помочь - person bas; 10.02.2013
comment
у меня нет репутации для голосования ... он компилируется правильно, но шрифт не устанавливается - person Shahin Rahbar; 10.02.2013
comment
Система не может найти указанный файл - person Shahin Rahbar; 10.02.2013
comment
Возможно, пришло время создать новый вопрос, в котором вы поделитесь соответствующим объемом информации, чтобы сообщество SO могло вам помочь. Скопируйте/вставьте код, который у вас есть прямо сейчас, и поделитесь ошибкой + трассировкой стека в новом вопросе. - person bas; 10.02.2013
comment
Может ли кто-нибудь помочь с ошибкой: Неверный дескриптор меню - person Lee; 15.05.2015
comment
@user2816736 user2816736 Некоторый контекст может помочь, и если у вас есть конкретный вопрос, задайте новый вопрос iso, комментарий к решенному вопросу - person bas; 15.05.2015

person    schedule
comment
Выйдите из системы, чтобы учесть шрифт - person JxDarkAngel; 09.10.2014