Подтвердить что ты не робот

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

Любые идеи о том, почему это не работает?

Спасибо.

4b9b3361

Ответ 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.