[Из песочницы] Агрессивная экономия энергии при работе от батареи на Windows


1ee627c200c94624b505dff322a78aeb.png

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


Управление питанием в Windows

Я не сильно осведомлен в том, как сейчас обстоят дела в плане работы от батареи на современных ноутбуках. Думаю, MacBook ещё мало кто может составить конкуренцию, но так как по долгу службы я пользуюсь Windows, то мои дела обстоят достаточно плохо. Хотя отзывов о неудовлетворительном времени работы на Windows нигде особенно и не слышно. Такое чувство, что современные устройства предоставляют вполне приемлемое время работы или во всех сценариях использования где-то рядом находится розетка.


d96205077a884260860c86c1824a968d.PNG

Тем не менее, меня как студента и обладателя отнюдь не передового ноутбука всерьез беспокоит вопрос сохранения энергии. В Windows 7 и выше присутствует подсистема управления питанием, в которой есть 3 предустановленных схемы:


  • Высокая производительность (снимает все ограничения по экономии энергии)
  • Экономия энергии (агрессивно подавляет всё, что может тратить заряд, отзывчивость при переключении между приложениями ощутимо падает)
  • Сбалансированная

Последняя установлена по умолчанию. Если вас не устраивает среднее положение и вы хотите максимум производительности при работе от сети и максимум жизни при работе от батареи, то вполне логично, что при отключении питания должна устанавливаться схема Экономия энергии, а при подключении обратно — Высокая производительность, не так ли? А вот и нет. Прямого пути для автоматического переключения нет. Вы можете создать свою схему питания и внутри неё настроить использование ресурсов для двух сценариев. Но разве кто-то хочет провести 20 минут в этом окошке?


f5897e4b06e74dbfac7900611dc0f748.PNG

Кроме того, в Windows 10 появилась замечательная кнопка для экономии энергии, но, насколько мне известно, её действие распространяется только на блокирование фоновых активностей UWP-приложений, что не очень интересно.


b6770da928c04b9085402b4516d2f827.PNG

Решение

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


49677ef143b04b61b6c232e951f0ac18.gif

Потом разум взыграл и было придумано использование bat-файлов для запуска незамысловатых команд в консоли, включающих определённые схемы управления питанием.


4be8d66f49b6457b963b88f9e43fcca9.gif

На это меня хватило дольше, но осознание дикости того, чем я занимаюсь постепенно пришло и в одну бессонную ночь было написано простейшее WinForms приложение на C#, которое слушает системный event и при изменении режима питания активирует определенную схему питания.


98b3142425a04beda62c48ca67a0c210.gif

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


Мы вешаем обработчик на системное событие:


SystemEvents.PowerModeChanged += OnPowerModeChanged;

И пишем сам обработчик:


private void OnPowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
    if (e.Mode == PowerModes.StatusChange)
    {
        switch (SystemInformation.PowerStatus.PowerLineStatus)
        {
            case PowerLineStatus.Online:
                DisablePowerSaving();
                break;
            case PowerLineStatus.Offline:
                EnablePowerSaving();
                break;
         }
    }
}

Всё банально и просто. Переключение режимов происходит по запуску утилиты powercfg в командной строке с передачей GUID нужной нам схемы питания:


private void EnablePowerSaving()
{
    RunCmdCommand("powercfg /setactive a1841308-3541-4fab-bc81-f71556f20b4a");
}

Весь код запускается из скрытой формы, сообщения об изменении режима локализованы на русском и английском языках. Программа ставится в автозагрузку копированием в папку Startup, в репозитории для этого даже есть специальный bat’ник.


→ Кстати, вот и репозиторий.


Приложение проверено на Windows 10, должно корректно работать на Windows 7 и выше. На Windows XP и Vista возникнут проблемы с путями к папке Startup. Надеюсь на вашу обратную связь, если будет спрос, то поддержка будет обязательно добавлена.


Спасибо за внимание. Это был мой первый пост, буду искренне рад критике кода и оформления статьи.

Комментарии (2)

  • 11 февраля 2017 в 14:59

    +3

    А не проще ли было настроить план электропитания и указать настройки для питания от сети и от батареи?
    • 11 февраля 2017 в 15:45 (комментарий был изменён)

      0

      Для меня например использование настроек для нескольких способов питания в одном плане контр-интуитивно. Было бы логичней КМК сделать каждый «план» просто пачкой настроек. И набор переключателей о событиям — на подключение шнурка питания, на работу от батареи, на определённый уровень заряда. Понятно, что какая система есть — такая есть.
      Кстати, некоторые вендоры ноутбуков примерно так и делают — из специальной утилитки переключают планы. И можно настроить, в каком режиме питания какой план использовать.

© Habrahabr.ru