C# 获取笔记本电池信息
获取电池信息需要调用Win32 Api
相关函数为 GetSystemPowerStatus
函数结构:
BOOL GetSystemPowerStatus(
LPSYSTEM_POWER_STATUS lpSystemPowerStatus
);
参数:
lpSystemPowerStatus:指向接收状态信息的 SYSTEM_POWER_STATUS 结构的指针 。
返回值:
如果函数成功,则返回值为非零。
如果函数失败,则返回值为零。
SYSTEM_POWER_STATUS 结构体 的定义:
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 | 严重—电池电量不足百分之五 |
8 | 充电中 |
128 | 无系统电池 |
255 | 未知状态-无法读取电池标志信息 |
如果不给电池充电并且电池容量介于高电量和低电量之间,则该值为零。
BatteryLifePercent
剩余电量的百分比。该成员的值可以在0到100的范围内,如果状态未知,则可以是255。
SystemStatusFlag
省电模式。
值 | 含义 |
---|---|
0 | 节电模式已关闭 |
1 | 节电模式已开启 |
BatteryLifeTime
剩余电池寿命的秒数;如果未知剩余秒数或设备连接到交流电源,则为–1。
BatteryFullLifeTime
充满电时的电池寿命秒数;如果未知电池的完整寿命或设备连接到交流电源,则为–1。
现在将 SYSTEM_POWER_STATUS 结构体 修改为对应的C#结构体类型:
public enum ACLineStatus_ : byte {
Offline = 0,
Online = 1, //
UnknowStatus = 255 // 未知
}
public enum BatteryFlag_ : byte { // 虽然是枚举,但可以有多个值
Middle = 0, // 电池未充电并且电池容量介于高电量和低电量之间
High = 1, // 电池电量超过66%
Low = 2, // 电池电量不足33%
Critical = 4, // 电池电量不足百分之五
Charging = 8, // 充电中
NoSystemBattery = 128, // 无系统电池
UnknowStatus = 255 // 无法读取电池标志信息
}
public enum SystemStatusFlag_ : byte {
Off = 0, // 节电功能已关闭
On = 1 // 节电功能已打开,节省电池。尽可能节约能源
}
public struct SystemPowerStatus { // 顺序不可更改
public ACLineStatus_ ACLineStatus; // 交流电源状态
public BatteryFlag_ BatteryFlag; // 电池充电状态
public byte BatteryLifePercent; // 剩余电量的百分比。该成员的值可以在0到100的范围内,如果状态未知,则可以是255
public SystemStatusFlag_ SystemStatusFlag; // 省电模式
public int BatteryLifeTime; // 剩余电池寿命的秒数。如果未知剩余秒数或设备连接到交流电源,则为–1
public int BatteryFullLifeTime; // 充满电时的电池寿命秒数。如果未知电池的完整寿命或设备连接到交流电源,则为–1。
}
示例代码:
using System;
using System.Linq;
using System.Net;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace ConsoleApp1 {
public enum ACLineStatus_ : byte {
Offline = 0,
Online = 1, //
UnknowStatus = 255 // 未知
}
public enum BatteryFlag_ : byte { // 虽然是枚举,但可以有多个值
Middle = 0, // 电池未充电并且电池容量介于高电量和低电量之间
High = 1, // 电池电量超过66%
Low = 2, // 电池电量不足33%
Critical = 4, // 电池电量不足百分之五
Charging = 8, // 充电中
NoSystemBattery = 128, // 无系统电池
UnknowStatus = 255 // 无法读取电池标志信息
}
public enum SystemStatusFlag_ : byte {
Off = 0, // 节电功能已关闭
On = 1 // 节电功能已打开,节省电池。尽可能节约能源
}
public struct SystemPowerStatus { // 顺序不可更改
public ACLineStatus_ ACLineStatus; // 交流电源状态
public BatteryFlag_ BatteryFlag; // 电池充电状态
public byte BatteryLifePercent; // 剩余电量的百分比。该成员的值可以在0到100的范围内,如果状态未知,则可以是255
public SystemStatusFlag_ SystemStatusFlag; // 省电模式
public int BatteryLifeTime; // 剩余电池寿命的秒数。如果未知剩余秒数或设备连接到交流电源,则为–1
public int BatteryFullLifeTime; // 充满电时的电池寿命秒数。如果未知电池的完整寿命或设备连接到交流电源,则为–1。
}
public class Demo {
[DllImport("Kernel32.dll")]
public static extern bool GetSystemPowerStatus(ref SystemPowerStatus systemPowerStatus);
public static void Main(string[] args) {
SystemPowerStatus status = new SystemPowerStatus();
if (GetSystemPowerStatus(ref status)) { // 如果成功调用
Console.WriteLine("当前电量:" + status.BatteryLifePercent + "%");
}
}
}
}
相关链接:https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getsystempowerstatus
欢迎转载!如转载请附上本文地址
若您在上文发现了错误,请在评论区处反馈,谢谢!