Как включить/отключить функцию экономии заряда батареи Windows 10 в программе?

Я пишу небольшую программу, чтобы сохранить аккумулятор для ноутбука, и теперь я могу переключаться между схемами питания с помощью PowerSetActiveScheme.

Следующим шагом будет контроль за батареей в Windows 10. Хотя я могу прочитать ее состояние с помощью GetSystemPowerStatus, я не могу найти способ его включения/отключения. Существуют ли какие-либо функции в Windows API?

Ответ 1

Скорее всего, вы можете сделать это Linux-способом, вызвав системное приложение с именем PowerCfg через ShellExecuteEx():

powercfg /setdcvalueindex SCHEME_CURRENT SUB_ENERGYSAVER ESBATTTHRESHOLD 100
powercfg /setactive scheme_current

Это означает, что энергосбережение активируется даже тогда, когда процентная доля батареи равна 100%. SUB_ENERGYSAVER и его под-GUID ESBATTTHRESHOLD описанный здесь.

Ответ 2

Вам, кажется, не повезло. В документах MSDN нет API, с помощью которого можно было бы контролировать батарею. Изучение настроекHandlers_OneCore_BatterySaver показывает, что отображается только GetSetting. Даже SetPowerState в WMI Win32_Battery не реализован - Я знаю, что это не совсем то, что вам нужно, но это показывает, что Microsoft не добралась до подвергая функциональность, связанную с батареей. На данный момент вместо того, чтобы обратная инженерия нажимает кнопку, лучше всего подражать ей что-то вроде AutoHotKey, но остерегайтесь подводных камней с этим.

Ответ 3

Ответ @hidefromkgb в значительной степени правильный. Единственная недостающая часть заключается в том, что для отключения Energy Saver и предотвращения его включения необходимо выполнить:

powercfg /setdcvalueindex SCHEME_CURRENT SUB_ENERGYSAVER ESBATTTHRESHOLD 0
powercfg /setdcvalueindex SCHEME_CURRENT SUB_ENERGYSAVER ESBRIGHTNESS 100 

Если вы сделаете это и вернетесь к разделу "Экономия заряда" на панели управления, вы увидите, что первый флажок теперь отключен (хотя он по-прежнему показывает 20%, но он неактивен, поэтому все должно быть в порядке). Также второй флажок (более низкая яркость экрана) будет снят.