Могу ли я сделать так, чтобы мой сервис не давал Windows спать? - PullRequest
4 голосов
/ 27 октября 2009

У меня есть служба Windows, которая должна работать на ПК, который оставлен на 24 часа.

Я не могу полагаться на то, что на компьютере отключен режим сна / выключения, поскольку он установлен на 3500 сайтах, а X, Y или Z могут означать, что режим сна / выключения не отключен.

Есть ли какой-нибудь изящный способ .NET, которым я могу не дать Windows дремлет?

Или будет достаточно периодической записи в файл (скажем, запись даты раз в минуту)?

Пожалуйста, не допускайте боковых / плохих предупреждений "вы не должны насиловать подобные вещи, оставьте это на усмотрение компьютера". Моя работа - убедиться, что эта программа достигает этого на компьютерах клиентов!

Ура! * * 1013

Edit:

[Большой вздох]

Как обычно, боковые стороны не могут не комментировать. Я пытался отговорить, чтобы избежать изложения - оправдать себя, но эй. Это не сработало. Люди предполагали, что я пытаюсь захватить «ИХ» компьютеры.

Он предназначен для корпоративных клиентов и отслеживает действия на оборудовании безопасности и регистрирует его. Как будто кто-то открывает дверь с помощью электронного ключа.

Поскольку двери должны функционировать 24 часа в сутки, они, очевидно, хотят вести лесозаготовки 24 часа в сутки.

Это не преступление. У них много сайтов, где они хотят, чтобы это произошло. Они не могут рассчитывать на то, что персонал отключит функции спящего режима и сна. Поэтому они попросили меня убедиться, что он может остаться в живых.

Опять же, это действительно не преступление. Иногда такие вещи просто случаются.

Я ненавижу оправдывать каждый вопрос, который я задаю здесь. Реальный мир просто не такой аккуратный и пушистый, как нам всем хотелось бы.

На более позитивной ноте, большое спасибо тем, кто помог !!

Ответы [ 3 ]

3 голосов
/ 27 октября 2009

Взгляните на SetThreadExecutionState API. Он позволяет уведомить систему о том, что ваше приложение активно, чтобы компьютер не переходил в спящий режим

3 голосов
/ 27 октября 2009

Да, есть! Это делают другие приложения (см., Например, Power DVD от Cyberlink), поэтому API есть.

Я предлагаю вам начать читать о API управления питанием Windows . Однако вам, возможно, придется прибегнуть к P \ Invoke для этого, поскольку я не думаю, что .NET предоставляет управляемые реализации для этих API.

В частности, кажется, что есть функция для регистрации вашего сервиса для уведомлений об изменениях состояния питания: RegisterPowerSettingNotification . Я предполагаю, что у вашей службы может быть способ потребовать отмены определенных изменений состояния питания (например, перехода в спящий режим).

Тогда вам также следует взглянуть на эти Функции управления питанием .

И, в крайнем случае - и тем не менее, вы можете заставить свой сервис генерировать и отправлять нажатия клавиш в систему через регулярные промежутки времени для имитации действий пользователя.

** ПРИМЕЧАНИЕ **

Поразмыслив над этим, я хотел бы отметить, что я выбрал бы подход к созданию профиля управления питанием в Windows, который настраивает компьютер, чтобы он никогда не переходил в спящий режим или режим гибернации. А затем из вашего приложения / службы отслеживайте профиль активного состояния питания (используя API выше) и, если он когда-либо изменится, программно измените его обратно. Это должен быть довольно чистый способ применения политики. См. PowerSetActiveScheme .

1 голос
/ 27 октября 2009

Мы столкнулись с подобной (но перевернутой) проблемой много месяцев назад с нашими системами обработки экстренных вызовов: разбудил монитор, который перешел в спящий режим, чтобы связанные с ним встроенные динамики воспроизводили мелодию звонка. Я обнаружил, что лучшим способом было использовать SendInput, чтобы программно переместить мышь на один пиксель, а затем снова вернуться. Код использовал MOUSEEVENTF_MOVE с SendInput. Это скорее нативный код, чем .Net, но он должен дать вам возможность начать поиск.

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