2015-11-13 2 views
0

У меня есть служба Windows, которая должна устанавливать шрифты. У меня есть папка, которая содержит шрифты, и я использую этот код, чтобы установить их:Служба Windows: установка шрифтов

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


var fontDestination = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), fontName); 

     if (File.Exists(fontDestination)) 
     { 
      return; 
     } 

     logger.Info(String.Format("Installing font: {0}", fontName)); 

     try 
     { 
      File.Copy(fontFullPath, fontDestination); 

      // Retrieves font name 
      var fontCollection = new PrivateFontCollection(); 
      fontCollection.AddFontFile(fontDestination); 
      var actualFontName = fontCollection.Families[0].Name; 

      //Add font 
      AddFontResource(fontDestination); 
      var error = Marshal.GetLastWin32Error(); 
      if (error == 0) 
      { 
       //Add registry entry 
       logger.Info(String.Format("Font {0} installed successfully", fontName)); 
       Registry.SetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts", 
        actualFontName, fontName, RegistryValueKind.String); 
      } 

Шрифт будет скопирован в fontDestination (Environment.GetFolderPath (Environment.SpecialFolder.Fonts)), а затем AddFontResource будет добавьте его в сеанс.

Все работает как ожидалось, если я запускаю службу в качестве консольного приложения или в режиме отладки. Шрифты становятся доступными в блокноте, слове и т. Д. Без перезапуска машины. Если я установил его и запустил в качестве службы, журнал подтверждает, что шрифт установлен успешно, добавлен реестр, файл находится в папке Windows/fonts, но недоступен в приложениях, которые его используют (блокнот, слово , etc)

Если я перезагружаю компьютер, то я подозреваю, что окна смотрят в реестр, видит файл в папке Windows/fonts и делает его доступным для использования приложениями. EDIT: Он действительно доступен после перезапуска.

Мне нужно запустить эту службу на виртуальной машине, которая не будет перезагружаться, поэтому мне нужно, чтобы шрифт был доступен сразу после установки.

Я подозреваю, что это имеет какое-то отношение к правам пользователей на услуги. Я указываю, что служба регистрируется как LocalSystem.

+0

какой части, что «я подозреваю» подозрение, и какая часть из этого на самом деле происходит? Способ, который в настоящее время формулируется, предполагает, что все части являются спекуляциями, поэтому: * являются * шрифтами, доступными после перезапуска? –

+0

Да, они доступны после перезагрузки, если они установлены из службы Windows. Если я запустил код, который я разместил внутри консольного приложения (или запустил службу в качестве консольного приложения), то они доступны без перезагрузки. –

+0

оба запускаются как admin? (т. е. служба, установленная с использованием учетных данных администратора, а консоль запускается как администратор?) –

ответ

0

Попробуйте отключить или перезапустить службу окна для кэша шрифтов

Смежные вопросы