Есть ли программный способ определить, может ли процесс взаимодействовать с рабочим столом? - PullRequest
2 голосов
/ 13 сентября 2011

У меня есть исполняемый файл, который может работать нормально или как служба.При запуске может отображаться сообщение об ошибке, если есть ошибка (с использованием MessageBox api).Это может привести к сбою, если приложение работает как служба, но не может взаимодействовать с рабочим столом. Процесс может зависать.Есть ли программный способ определить, может ли приложение взаимодействовать с рабочим столом?Затем я могу использовать другой механизм уведомления об ошибках (файл журнала и т. Д.)

Ответы [ 3 ]

2 голосов
/ 13 сентября 2011

Вы можете указать MB_SERVICE_NOTIFICATION при вызове MessageBox(), что будет отображать сообщение в текущем активном сеансе.

Но отображение окна сообщения из службы - это не то, что вам действительно нужно.

Сервисы должны работать в фоновом режиме и не взаимодействовать с пользователями напрямую. Одна из их характеристик заключается в том, что они могут (и часто работают), даже если ни один пользователь не вошел в систему. В Windows Vista они даже работают в совершенно другом сеансе, чем все остальные пользователи. Отображение MessageBox может привести к тому, что ваши службы будут заблокированы, потому что сообщение было вызвано в сеансе вашей службы без уведомления пользователя.

Запись в какой-либо файл журнала или использование окна EventLog является предпочтительным методом.

1 голос
/ 14 сентября 2011

С http://msdn.microsoft.com/en-us/library/ms683502(VS.85).aspx:

Чтобы определить, работает ли служба как интерактивная служба, вызовите функцию GetProcessWindowStation для получения дескриптора оконной станции и функцию GetUserObjectInformation для проверки, имеет ли оконная станция атрибут WSF_VISIBLE.

1 голос
/ 13 сентября 2011

С MSDN :

Чтобы определить, работает ли сервис как интерактивный сервис, вызовите функцию GetProcessWindowStation для получения дескриптора оконной станции и функцию GetUserObjectInformationчтобы проверить, имеет ли оконная станция атрибут WSF_VISIBLE.

В .NET вы можете использовать Environment.UserInteractive

Свойство UserInteractive сообщает false дляпроцесс Windows или служба, подобная IIS, которая работает без пользовательского интерфейса.Если это свойство имеет значение false, не отображать модальные диалоговые окна или окна сообщений, поскольку отсутствует графический интерфейс пользователя, с которым пользователь мог бы взаимодействовать.

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