C# 获取笔记本电池信息 调用 Win32 Api

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


欢迎转载!如转载请附上本文地址

若您在上文发现了错误,请在评论区处反馈,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值