使用.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
相关产品推荐
相关产品推荐

