You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用.NET WMI API开发C#电池记录应用遇CIM_Battery无实例问题

解决C#中WMI读取CIM_Battery无实例的问题

嘿,我之前在做类似的电池监控工具时也碰到过这个问题!CIM_Battery作为抽象基类,很多时候确实没有直接的实例,这是因为实际的电池信息是由它的子类来提供的,比如Win32_Battery。下面给你几个可行的解决办法:

1. 改用Win32_Battery WMI类

Win32_Battery是CIM_Battery的具体实现子类,几乎所有带电池的设备都会在这个类下存在可用实例。你可以用这段代码来读取电池百分比:

using System.Management;

public class BatteryMonitor
{
    public static void FetchBatteryInfo()
    {
        try
        {
            // 构造WMI查询,指定root/CIMV2命名空间和Win32_Battery类
            var searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Battery");
            
            foreach (var battery in searcher.Get())
            {
                // 读取剩余电量百分比
                var chargeRemaining = battery["EstimatedChargeRemaining"];
                Console.WriteLine($"当前电池剩余百分比: {chargeRemaining}%");
                
                // 还可以读取其他属性,比如电池状态、预估剩余时间
                var status = battery["BatteryStatus"];
                Console.WriteLine($"电池状态: {status}");
            }
        }
        catch (ManagementException ex)
        {
            Console.WriteLine($"WMI查询出错: {ex.Message}");
        }
    }
}

2. 使用系统API替代WMI(兼容性更强)

有些笔记本厂商的WMI实现可能存在兼容性问题,这时候直接调用Windows原生的系统API会更可靠。GetSystemPowerStatus是专门用于获取电源状态的函数,很多专业电池监控软件都用这个方案:

using System;
using System.Runtime.InteropServices;

public class BatteryStatusReader
{
    // 定义电源状态结构体
    [StructLayout(LayoutKind.Sequential)]
    private struct SYSTEM_POWER_STATUS
    {
        public byte ACLineStatus;       // 交流电源状态:0=断开,1=连接,255=未知
        public byte BatteryFlag;        // 电池状态标志
        public byte BatteryLifePercent; // 剩余电量百分比,255=未知
        public byte Reserved;
        public uint BatteryLifeTime;    // 预估剩余使用时间(秒),0xFFFFFFFF=未知
        public uint BatteryFullLifeTime;// 满电总时间(秒),0xFFFFFFFF=未知
    }

    // 导入kernel32.dll中的GetSystemPowerStatus函数
    [DllImport("kernel32.dll")]
    private static extern bool GetSystemPowerStatus(out SYSTEM_POWER_STATUS powerStatus);

    public static void GetBatteryPercentage()
    {
        SYSTEM_POWER_STATUS status = new SYSTEM_POWER_STATUS();
        if (GetSystemPowerStatus(out status))
        {
            if (status.BatteryLifePercent == 255)
            {
                Console.WriteLine("无法获取电池百分比信息");
            }
            else
            {
                Console.WriteLine($"当前电池剩余百分比: {status.BatteryLifePercent}%");
            }
        }
        else
        {
            Console.WriteLine("获取电源状态失败");
        }
    }
}

额外小贴士

  • 如果你坚持想用CIM_Battery,可以尝试查询它的所有子类实例,用WQL语句:SELECT * FROM CIM_Battery,但实际测试中Win32_Battery的可用性更高。
  • 偶尔WMI查询失败可能和权限有关,可以尝试以管理员身份运行你的程序(不过读取电池信息通常不需要管理员权限)。

内容的提问来源于stack exchange,提问作者ifconfig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:33:04