c # — отправка системы в спящий режим сразу после выхода из системы в системе Windows

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

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

Выполняя тесты, я поставил жестко заданную задержку (с помощью Sleep (5000) API), которая, казалось, решала проблему на большинстве систем, но я все еще получаю тот же результат на других. В этом случае я бы не хотел вводить более длительную задержку, поскольку она не решает проблему в действительности или отвечает на вопрос, почему это произошло в первую очередь. Кроме того, я уверен, что существует «медленная» система, для которой даже 10 секунд будет недостаточно …

Итак, кто-нибудь есть идеи, как исправить эти сбои в спящем API?

PS. Я запускаю свои тесты на последней версии Windows 7.

1

Решение

Использовать SystemEvents Class.. Я надеюсь, что это работает для вас ..

Microsoft.Win32.SystemEvents.SessionEnded+=
new SessionEndedEventHandler(SystemEvents_SessionEnded);

и метод-обработчик ..

private void SystemEvents_SessionEnded(object sender, SessionEndedEventArgs e)
{
if (e.Reason == SessionEndReasons.Logoff)
{
//this may sleep the system even when user logs off manually.
Application.SetSuspendState(PowerState.Suspend, true, true);
}
}

вам нужно импортировать using Microsoft.Win32; Пространство имен

1

Другие решения

Возможно, что-то блокирует спящий режим системы. Драйверы могут запретить системе спать, а некоторые системы просто не могут спать.

Когда вы попадаете в ситуацию, когда SetSuspendState не ведет себя, запустите «powercfg -energy» и «powercfg -requests». Эта утилита очень удобна для диагностики проблем со сном, поэтому вам также следует проверить «powercfg /?» чтобы увидеть все его особые силы.

0

Я должен опубликовать это как ответ на свой вопрос, потому что это решение сработало для меня. Это довольно громоздкий подход, поэтому я был бы признателен, если бы кто-то мог опубликовать другое решение.

Итак, вкратце, перед выходом из системы необходимо собрать идентификаторы их сеансов. Затем выполните API-интерфейс для входа учетных записей пользователя, в то время как в то же время необходимо прослушать и дождаться уведомления WTS_SESSION_LOGOFF из другого потока и продолжать делать это, пока сеансы (собранные ранее) не будут отключены.

Но это еще не все. По какой-то неизвестной причине (по которой я не смог найти документацию) после этого нам нужно дождаться сеанса, который имеет состояние WTSConnected и не имеет имени пользователя. Только тогда мы можем вызвать SetSuspendState для сна или гибернации.

-1
По вопросам рекламы [email protected]