Служба, запускающая процесс, не показывает GUI C#
Эй, я пытаюсь получить службу для запуска моей программы, но она не показывает графический интерфейс. Процесс начинается, но ничего не отображается. Я попытался включить "Разрешить службе взаимодействовать с рабочим столом", но это все еще не работает. Моя программа - это устройство блокировки компьютера, которое предотвращает доступ к компьютеру неавторизованных пользователей. Я использую Windows 7 с 64-битной ОС.
Вот код моего сервиса:
protected override void OnStart(string[] args)
{
Process p = new Process();
p.StartInfo.FileName = "notepad.exe";
p.Start();
FileStream fs = new FileStream(@"C:\Users\David\Documents\Visual Studio 2010\Projects\LockPCService\LockPCService\bin\Debug\ServiceLog.dj",
FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter m_streamWriter = new StreamWriter(fs);
m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
m_streamWriter.WriteLine(" LockPCService: Service Started " + DateTime.Now + "\n" + "\n");
m_streamWriter.Flush();
m_streamWriter.Close();
}
protected override void OnStop()
{
FileStream fs = new FileStream(@"C:\Users\David\Documents\Visual Studio 2010\Projects\LockPCService\LockPCService\bin\Debug\ServiceLog.dj",
FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter m_streamWriter = new StreamWriter(fs);
m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
m_streamWriter.WriteLine(" LockPCService: Service Stopped " + DateTime.Now + "\n"); m_streamWriter.Flush();
m_streamWriter.Close();
}
Чтобы попытаться заставить сервис работать, я использую notepad.exe. Когда я смотрю на процессы, блокнот работает, но нет графического интерфейса. Также ServiceLog есть и работает каждый раз, когда я запускаю его.
Любые идеи о том, почему это не работает?
Благодарю.
4 ответа
Эта статья объясняет Session 0 Isolation
что, помимо прочего, запрещает службам создавать пользовательский интерфейс в Windows Vista/7. В вашем сервисе запускается другой процесс, он запускается в сеансе 0 и также не будет отображать никакой пользовательский интерфейс. (Кстати, пользовательский интерфейс создан, просто сессия 0 никогда не отображается). Эта статья о CodeProject может помочь вам создать процесс из службы на рабочем столе пользователя и показать его пользовательский интерфейс.
Также, пожалуйста, подумайте об обтекании потоковых объектов в using
заявление, чтобы они правильно распорядились.
Службы запускаются под другой учетной записью, поэтому блокнот запускается другим пользователем и на другом рабочем столе, поэтому его нельзя увидеть. "Разрешить службе взаимодействовать с рабочим столом" больше не поддерживается, начиная с Vista.
Я знаю, что это поздний пост, но я обнаружил, что эта статья была очень полезна для меня. Я использую Windows 7, и решение, представленное в этой статье, прекрасно работает.
Если вы загружаете код, есть класс ApplicationLoader
, Включите этот класс в свой проект, и тогда это так просто:
// the name of the application to launch
String applicationName = "cmd.exe";
// launch the application
ApplicationLoader.PROCESS_INFORMATION procInfo;
ApplicationLoader.StartProcessAndBypassUAC(applicationName, out procInfo);
Службы запускаются в другом сеансе входа и имеют другую оконную станцию от пользователя. Это означает, что вся активность GUI отделена от программ пользователя, а не то, что служба не может отображать GUI. На самом деле, этот дизайн значительно упрощает временную блокировку доступа к программам пользователя.
Вам нужно будет позвонить в SwitchDesktop.