Агрессивная экономия энергии при работе от батареи на Windows

в 11:49, , рубрики: .net, C#, windows, батарея, ноутбук, разработка под windows
Агрессивная экономия энергии при работе от батареи на Windows - 1

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

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

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

Агрессивная экономия энергии при работе от батареи на Windows - 2

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

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

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

Агрессивная экономия энергии при работе от батареи на Windows - 3

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

Агрессивная экономия энергии при работе от батареи на Windows - 4

Решение

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

Агрессивная экономия энергии при работе от батареи на Windows - 5

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

Агрессивная экономия энергии при работе от батареи на Windows - 6

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

Агрессивная экономия энергии при работе от батареи на Windows - 7

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

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

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. Надеюсь на вашу обратную связь, если будет спрос, то поддержка будет обязательно добавлена.

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

Автор: nuc134r

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js