这篇文章介绍:如何利用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