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

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

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

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

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

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

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