Как правильно запретить Windows переходить в спящий режим
В одной из предыдущих статей я описывал способ, как можно запретить Windows переходить в спящий режим. Там это было реализовано через имитацию активности пользователя. Способ действительно рабочий, но с точки зрения решения поставленной задачи не совсем корректный. Настало время исправить ситуацию. Итак, наиболее правильный способ запретить Windows переходить в спящий режим - это использование функции SetThreadExecutionState. В качестве параметра она принимает один или комбинацию из нескольких флагов:Code (Assembler) : Убрать нумерацию
- ES_CONTINUOUS = 0x80000000
- ES_DISPLAY_REQUIRED = 0x00000002
- ES_SYSTEM_REQUIRED = 0x00000001
- ES_AWAYMODE_REQUIRED = 0x00000040
Для разных задач использование SetThreadExecutionState может отличаться. Например, если ваше приложение должно оставаться активным только на время продолжительного выполнения какого-нибудь критического участка кода, то перед его началом надо зафиксировать состояние запрета перехода системы в спящий режим, а после окончания этот запрет снять.
Code (Assembler) : Убрать нумерацию
- ; Установить состояние постоянной активности системы и монитора
- invoke SetThreadExecutionState,ES_CONTINUOUS+ES_SYSTEM_REQUIRED+\
- ES_DISPLAY_REQUIRED
- ; Тут выполняется какой-то очень важный процесс, который
- ; нельзя прерывать
- ; Сбросить состояние постоянной активности
- invoke SetThreadExecutionState,ES_CONTINUOUS
Если требуется держать систему в активном состоянии на протяжении всего времени работы вашего приложения или в какие-то определенные моменты, то можно запускать функцию SetThreadExecutionState без флага ES_CONTINUOUS. В этом случае при каждом вызове она будет просто обнулять таймер бездействия. При таком варианте использования функцию придется запускать с нужной периодичностью, например, по таймеру.
Code (Assembler) : Убрать нумерацию
- ; Обработчик сообщений окна
- cmp [msg],WM_TIMER
- je .wmtimer
- ...
- ...
- .wmtimer:
- ; Передать системе состояние активности
- invoke SetThreadExecutionState,ES_DISPLAY_REQUIRED+ES_SYSTEM_REQUIRED
Важное замечание. Поскольку в этом случае активность пользователя не эмулируется, то и описанные ранее способы определить время бездействия системы покажут увеличивающиеся счетчики с момента последнего ввода или движения мышкой.
В приложении примеры программ с исходными текстами, которые на время своей работы блокируют запуск скринсейвера и переход системы в спящий режим.
Примеры программ с исходными текстами (FASM)
Advanced.Preventing.Windows.to.Sleeping.Demo.zip (3,884 bytes)
Advanced.Preventing.Windows.to.Sleeping.Demo.zip (3,884 bytes)
Просмотров: 3356 | Комментариев: 4
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(28.04.2020 в 19:08):
А еще можно индуса за комп посадить, чтобы круглосуточно мышкой двигал за миску риса.
BlackFox
(28.04.2020 в 18:58):
Можно PowerPoint запускать в режиме презентации
ManHunter
(15.03.2019 в 11:21):
Все исходники в комплекте, можно пересобрать как надо.
mixa
(15.03.2019 в 10:51):
Спасибо за прогу! Хоть и это всего лишь демонстрационная версия, но даже так мне она будет полезна.
Добавить комментарий
Заполните форму для добавления комментария