Отключение дисплея из службы Windows - PullRequest
3 голосов
/ 16 ноября 2009

Я написал службу Windows, которая должна выключать дисплей при возникновении определенных условий. Код, который я использую:

private const int MONITOR_OFF = 2;
SendMessage(GetDesktopWindow().ToInt32(), 
   WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF);

Этот же код работает из приложения Windows, но при выполнении из службы Windows ничего не происходит. Также нет исключения, и Marshal.GetLastWin32Error() также возвращает 0.

Есть идеи о том, чего мне не хватает?

Ответы [ 3 ]

5 голосов
/ 16 ноября 2009

Поскольку у службы нет доступа по умолчанию к рабочему столу, поэтому ваш вызов GetDesktopWindow () возвращает нечто иное, чем вы ожидаете; Затем вы слепо конвертируете это в Int32 и используете это как цель дескриптора окна SendMessage (). Поскольку получатель, вероятно, не является действительным окном, он ничего не делает.

2 голосов
/ 16 ноября 2009

Вы можете попробовать изменить свойства службы в утилите управления службами, чтобы разрешить взаимодействие с рабочим столом.

0 голосов
/ 16 ноября 2009

Службы работают в своем собственном пространстве виртуального рабочего стола (они могут даже иметь свое собственное пространство профиля пользователя.) Это часть модели безопасности, встроенной в Windows. Лучше всего было бы иметь службу, работающую в фоновом режиме, и клиент в пользовательском режиме, который работает на рабочем столе пользователя. В зависимости от уровня доступа пользователя было бы возможно для пользователя, чтобы убить клиент службы / пользовательский режим. Но вы также можете запросить процессы, чтобы убедиться, что пользовательское приложение все еще работает.

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