Blog. Just Blog

Как правильно запретить Windows переходить в спящий режим

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
В одной из предыдущих статей я описывал способ, как можно запретить Windows переходить в спящий режим. Там это было реализовано через имитацию активности пользователя. Способ действительно рабочий, но с точки зрения решения поставленной задачи не совсем корректный. Настало время исправить ситуацию. Итак, наиболее правильный способ запретить Windows переходить в спящий режим - это использование функции SetThreadExecutionState. В качестве параметра она принимает один или комбинацию из нескольких флагов:
  1. ES_CONTINUOUS        = 0x80000000
  2. ES_DISPLAY_REQUIRED  = 0x00000002
  3. ES_SYSTEM_REQUIRED   = 0x00000001
  4. ES_AWAYMODE_REQUIRED = 0x00000040
Значения флагов хорошо расписаны в MSDN. Так, ES_SYSTEM_REQUIRED не дает системе перейти в спящий режим. Флаг ES_DISPLAY_REQUIRED отвечает за активность дисплея. Это касается как блокировки запуска скринсейвера, так и подавления таймера отключения монитора при бездействии, если в нем есть такая функция. Флаг ES_AWAYMODE_REQUIRED в основном используется мультимедийными приложениями для выполнения своих фоновых задач, обычным приложениям он вряд ли потребуется. Флаг ES_CONTINUOUS фиксирует состояние активности системы до следующего вызова функции с этим флагом и комбинацией других флагов.

Для разных задач использование SetThreadExecutionState может отличаться. Например, если ваше приложение должно оставаться активным только на время продолжительного выполнения какого-нибудь критического участка кода, то перед его началом надо зафиксировать состояние запрета перехода системы в спящий режим, а после окончания этот запрет снять.
  1.         ; Установить состояние постоянной активности системы и монитора
  2.         invoke  SetThreadExecutionState,ES_CONTINUOUS+ES_SYSTEM_REQUIRED+\
  3.                 ES_DISPLAY_REQUIRED
  4.  
  5.         ; Тут выполняется какой-то очень важный процесс, который
  6.         ; нельзя прерывать
  7.  
  8.         ; Сбросить состояние постоянной активности
  9.         invoke  SetThreadExecutionState,ES_CONTINUOUS
Для снятия запрета надо вызвать функцию SetThreadExecutionState с единственным флагом ES_CONTINUOUS. Теперь система может спокойно запускать скринсейвер, переходить в спящий режим, понижать частоту процессора при простое и т.п.

Если требуется держать систему в активном состоянии на протяжении всего времени работы вашего приложения или в какие-то определенные моменты, то можно запускать функцию SetThreadExecutionState без флага ES_CONTINUOUS. В этом случае при каждом вызове она будет просто обнулять таймер бездействия. При таком варианте использования функцию придется запускать с нужной периодичностью, например, по таймеру.
  1.         ; Обработчик сообщений окна
  2.         cmp     [msg],WM_TIMER
  3.         je      .wmtimer
  4.         ...
  5.         ...
  6. .wmtimer:
  7.         ; Передать системе состояние активности
  8.         invoke  SetThreadExecutionState,ES_DISPLAY_REQUIRED+ES_SYSTEM_REQUIRED
Дополнительных действий для отмены запрета перехода в спящий режим здесь не требуется. Достаточно прекратить вызывать в приложении функцию SetThreadExecutionState и системный таймер бездействия возобновит свой отсчет сразу после ее последнего вызова.

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

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

Примеры программ с исходными текстами (FASM)Примеры программ с исходными текстами (FASM)

Advanced.Preventing.Windows.to.Sleeping.Demo.zip (3,884 bytes)


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 413 | Комментариев: 2

Комментарии

Отзывы посетителей сайта о статье
ManHunter (15.03.2019 в 11:21):
Все исходники в комплекте, можно пересобрать как надо.
mixa (15.03.2019 в 10:51):
Спасибо за прогу! Хоть и это всего лишь демонстрационная версия, но даже так мне она будет полезна.

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2019
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.1 сек. / MySQL: 2 (0.0045 сек.) / Память: 5 Mb
Наверх