Сервис, запускающий процесс, не отображает GUI С#
Эй, я пытаюсь получить сервис, чтобы начать свою программу, но он не показывает графический интерфейс. Процесс начинается, но ничего не отображается. Я попытался включить "Разрешить службу взаимодействовать с рабочим столом", но это все еще не работает.
Моя программа является устройством блокировки компьютера, чтобы остановить доступ неавторизованных пользователей к компьютеру. Я запускаю 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 существует и работает каждый раз, когда я его запускаю.
Любые идеи о том, почему это не работает?
Спасибо.
Ответы
Ответ 1
В этой статье объясняется Session 0 Isolation
, который, среди прочего, запрещает услуги создавать пользовательский интерфейс в Windows Vista/7. В вашей службе запускается другой процесс, он запускается в сеансе 0, а также не будет отображаться какой-либо пользовательский интерфейс. (Кстати, пользовательский интерфейс создан, он просто не показывает сеанс 0). Эта статья в CodeProject может помочь вам создать процесс из службы на рабочем столе пользователя и показать его пользовательский интерфейс.
Кроме того, рассмотрите возможность переноса объектов потока в using
statement, чтобы они были правильно расположены.
Ответ 2
Службы работают под другой учетной записью, поэтому блокнот запускается другим пользователем и на другом рабочем столе, поэтому вы не можете его видеть. "Разрешить работу с рабочим столом" больше не поддерживается начиная с Vista.
Ответ 3
Я знаю, что это поздняя публикация, но я обнаружил, что эта статья была очень полезной для меня. Я запускаю 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);
Ответ 4
Сервисы запускаются в другом сеансе входа в систему и имеют другую оконную станцию от пользователя. Это означает, что вся деятельность GUI отделена от пользовательских программ, а не то, что служба не может отображать графический интерфейс. На самом деле, эта конструкция значительно упрощает временный доступ к пользовательским программам.
Вам нужно будет вызвать SwitchDesktop.