Служба, запускающая процесс, не показывает 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.

Другие вопросы по тегам