У меня есть служба 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.
какой части, что «я подозреваю» подозрение, и какая часть из этого на самом деле происходит? Способ, который в настоящее время формулируется, предполагает, что все части являются спекуляциями, поэтому: * являются * шрифтами, доступными после перезапуска? –
Да, они доступны после перезагрузки, если они установлены из службы Windows. Если я запустил код, который я разместил внутри консольного приложения (или запустил службу в качестве консольного приложения), то они доступны без перезагрузки. –
оба запускаются как admin? (т. е. служба, установленная с использованием учетных данных администратора, а консоль запускается как администратор?) –