Служба, запускающая процесс, не показывает GUI C # - PullRequest
11 голосов
/ 26 сентября 2010

Эй, я пытаюсь получить службу для запуска моей программы, но она не отображает графический интерфейс.Процесс начинается, но ничего не отображается.Я попытался включить «Разрешить службе взаимодействовать с рабочим столом», но это все еще не работает.Моя программа - это устройство блокировки компьютера, которое предотвращает доступ к компьютеру неавторизованных пользователей.Я использую 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 ]

21 голосов
/ 26 сентября 2010

В этой статье объясняется Session 0 Isolation, которая, помимо прочего, запрещает службам создавать пользовательский интерфейс в Windows Vista / 7. В вашем сервисе запускается другой процесс, он запускается в сеансе 0 и также не будет отображать никакой пользовательский интерфейс. (Кстати, пользовательский интерфейс создан, просто сессия 0 никогда не отображается). Эта статья о CodeProject может помочь вам создать процесс из службы на рабочем столе пользователя и показать его пользовательский интерфейс.

Кроме того, рассмотрите возможность упаковки потоковых объектов в оператор using , чтобы они правильно располагались.

4 голосов
/ 25 октября 2012

Я знаю, что это поздний пост, но я обнаружил, что эта статья была очень полезна для меня. Я использую 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 голосов
/ 26 сентября 2010

Службы запускаются под другой учетной записью, поэтому блокнот запускается другим пользователем и на другом рабочем столе, поэтому вы его не видите.«Разрешить службе взаимодействовать с рабочим столом» больше не поддерживается, начиная с Vista.

2 голосов
/ 26 сентября 2010

Службы работают в другом сеансе входа в систему и имеют другую оконную станцию ​​от пользователя.Это означает, что вся активность GUI отделена от программ пользователя, а не то, что служба не может отображать GUI.На самом деле, этот дизайн значительно упрощает временную блокировку доступа к программам пользователя.

Вам нужно будет позвонить SwitchDesktop .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...