Blog. Just Blog

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

12.03.2019 | Категория: Образ мышления: 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. Теперь система может спокойно запускать скринсейвер, переходить в спящий режим, понижать частоту процессора при простое и т.п.

Читать статью целиком »
Просмотров: 412 | Комментариев: 2

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2019
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 1 (0.0147 сек.) / Память: 4.75 Mb
Наверх