C++ 设置电源计划(节能,平衡,高性能),获取电池信息

5 篇文章 1 订阅

这篇文章介绍:如何利用C++ 获取电池信息,获取电源计划和设置电源计划。

  • windows系统的电源计划有4种

  •  程序定义枚举
    enum EmBatteryStrategy
    {
        IV_BATTERY_UNKNOWN          = 0,
        IV_BATTERY_POWER_SAVER      = 1,    // 节能
        IV_BATTERY_BALANCED         = 2,    // 平衡
        IV_BATTERY_HIGH_PERFORMANCE = 3,    // 高性能
        IV_BATTERY_SUPERIOR         = 4,    // 卓越性能
    };
  • 废话不多说,我们直接上代码
  • 先定义头文件,在头文件里面我们定义的电池的状态,电源计划的状态,3个获取电池信息的接口:
   enum EmDevmgrBatteryType
    {
        IV_DEVMGR_UNKNOWN = 0,
        IV_DEVMGR_NO_BATTERY = 1,           // 没有电池
        IV_DEVMGR_BATTERY_CHARGING = 2,     // 正在充电
        IV_DEVMGR_BATTERY_USING = 3,
    };

    enum EmBatteryStrategy
    {
        IV_BATTERY_UNKNOWN          = 0,
        IV_BATTERY_POWER_SAVER      = 1,    // 节能
        IV_BATTERY_BALANCED         = 2,    // 平衡
        IV_BATTERY_HIGH_PERFORMANCE = 3,    // 高性能
        IV_BATTERY_SUPERIOR         = 4,    // 卓越性能
    };

    class Battery 
    {
    public:
        // 获取电源信息(电源状态,剩余电源,可用时长)
        static BOOL GetBatteryData(EmDevmgrBatteryType& nBatteryState, int& nBatteryPct, unsigned __int64& ullAvailTime);
        // 获取当前电源模式(高性能模式,平衡模式,节能模式)
        static EmBatteryStrategy GetBatteryStrategy();
        // 设置电源模式
        static BOOL SetBatteryStrategy(EmBatteryStrategy nStrategy);
    };
  • 下面是实现部分,最前面定义的4个GUID是每个电源计划的GUID值,这个值是固定的
    namespace
    {
        const GUID PowerSchemeSaver = { 0xA1841308, 0x3541, 0x4FAB, { 188, 129, 247, 21, 86, 242, 11, 74 } };       // 节能
        const GUID PowerSchemeBalance = { 0x381B4222, 0xF694, 0x41F0, { 150, 133, 255, 91, 178, 96, 223, 46 } };    // 平衡
        const GUID PowerSchemeHigh = { 0x8C5E7FDA, 0xE8BF, 0x4A96, { 154, 133, 166, 226, 58, 140, 99, 92 } };       // 高性能
        const GUID PowerSchemeSuperior = { 0x91D47585, 0x1A6B, 0x402B, { 128, 81, 103, 214, 59, 243, 194, 254 } };  // 卓越性能
    }

    BOOL Battery::GetBatteryData(EmDevmgrBatteryType& nBatteryState, int& nBatteryPct, unsigned __int64& ullAvailTime)
    {
        SYSTEM_POWER_STATUS sps;
        ::GetSystemPowerStatus(&sps);

        if (sps.BatteryFlag == BATTERY_FLAG_NO_BATTERY)
        {
            nBatteryState = IV_DEVMGR_NO_BATTERY;
        }
        else if (sps.ACLineStatus == AC_LINE_ONLINE)
        {
            nBatteryState = IV_DEVMGR_BATTERY_CHARGING;
        }
        else
        {
            nBatteryState = IV_DEVMGR_BATTERY_USING;
        }

        nBatteryPct = static_cast<int>(sps.BatteryLifePercent);
        ullAvailTime = static_cast<unsigned __int64>(sps.BatteryLifeTime);
        return TRUE;
    }

    EmBatteryStrategy Battery::GetBatteryStrategy()
    {
        EmBatteryStrategy nStrategy = IV_BATTERY_UNKNOWN;

        GUID* CurrentScheme;
        if (ERROR_SUCCESS != PowerGetActiveScheme(NULL, &CurrentScheme))
        {
            return nStrategy;
        }

        if (*CurrentScheme == PowerSchemeSuperior)
        {
            nStrategy = EmBatteryStrategy::IV_BATTERY_SUPERIOR;
        }
        else if (*CurrentScheme == PowerSchemeHigh)
        {
            nStrategy = EmBatteryStrategy::IV_BATTERY_HIGH_PERFORMANCE;
        }
        else if (*CurrentScheme == PowerSchemeBalance)
        {
            nStrategy = EmBatteryStrategy::IV_BATTERY_BALANCED;
        }
        else if (*CurrentScheme == PowerSchemeSaver)
        {
            nStrategy = EmBatteryStrategy::IV_BATTERY_POWER_SAVER;
        }

        LocalFree(CurrentScheme);
        return nStrategy;
    }

    BOOL Battery::SetBatteryStrategy(EmBatteryStrategy nStrategy)
    {
        if (nStrategy == EmBatteryStrategy::IV_BATTERY_HIGH_PERFORMANCE)
        {
            return (ERROR_SUCCESS == PowerSetActiveScheme(NULL, &PowerSchemeHigh));
        }
        if (nStrategy == EmBatteryStrategy::IV_BATTERY_BALANCED)
        {
            return (ERROR_SUCCESS == PowerSetActiveScheme(NULL, &PowerSchemeBalance));
        }
        if (nStrategy == EmBatteryStrategy::IV_BATTERY_POWER_SAVER)
        {
            return (ERROR_SUCCESS == PowerSetActiveScheme(NULL, &PowerSchemeSaver));
        }

        return FALSE;
    }

 下面可以讲下电池其它信息如何获取

SYSTEM_POWER_STATUS sps;
::GetSystemPowerStatus(&sps)

其实通过GetSystemPowerStatus这个接口我们还可以获取更加详细的电池信息,GetSystemPowerStatus方法获取的结构体定义如下:

typedef struct _SYSTEM_POWER_STATUS {
  BYTE  ACLineStatus;
  BYTE  BatteryFlag;
  BYTE  BatteryLifePercent;
  BYTE  SystemStatusFlag;
  DWORD BatteryLifeTime;
  DWORD BatteryFullLifeTime;
} SYSTEM_POWER_STATUS, *LPSYSTEM_POWER_STATUS;

我们可以看看每个变量的值:

ACLineStatus電源狀態

意義

0

離線

1

線上

255

未知的狀態

BatteryFlag 電池計量狀態

意義

1

高- 電池容量超過 66%

2

低- 電池容量小於 33%。

4

重大— 電池容量小於 5%

8

充電

128

無系統電池

255

未知狀態 - 無法讀取電池旗標資訊

BatteryLifePercent 剩餘電池計量的百分比。 這個成員可以是範圍 0 到 100 的值,如果狀態不明,則為 255。

SystemStatusFlag省電模式的狀態

意義

0

省電模式已關閉。

1

省電模式開啟。 盡可能節省能源。

BatteryLifeTime 剩餘的電池使用時間秒數,如果剩餘的秒數不明或裝置已連線到 AC 電源,則為 –1

BatteryFullLifeTime處於完全充電狀態的電池使用時間秒數,如果完整電池存留期不明,或裝置是否連線到 AC 電源,則為 –1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那一片海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值