用WMI方式查看了一下自己笔记本电池的剩余时间,结果得到了71582788分钟这个结果,顿感意外,第一感觉是相关的代码写错了。
class="brush:csharp;gutter:true;">ManagementObjectSearcher s = new ManagementObjectSearcher("select * from Win32_Battery"); ManagementObjectCollection m = s.Get(); foreach (ManagementObject mo in m) { Console.WriteLine(mo["EstimatedRunTime"].ToString() + "minutes"); }
检查了几遍,没有发现问题,又在网上搜寻类似的代码,也是这般的写法。
在被困扰了一段时间后,尝试着拔掉了笔记本的电源线,再次启动程序,这次不是71582788这个数值了。
所以结论是该代码只有在不使用外接电源的情况下才能获得正确的结果。
那么在使用外接电源的时候为什么会得到71582788这么奇怪的数字呢?
其实从EstimatedRunTime这个属性得到的值是以分钟为单位的。71582788分钟换算成秒就是4294967296,也就是2^32。一个32位秒计数器的最大值就是这个值。
换句话来讲,因为插上电源的情况下,理论上笔记本可以一直使用下去,所以EstimatedRunTime使用71582788分钟来表示可以无限使用的含义。
以上纯属本人的猜测。
需要补充的是,既使拔了电源线,最后所得的结果也未必是正确的。
可以多运行几次这个程序,不难发现,每次的结果都是不一致的,而且差异很大,甚至误差在一个小时以上。
不过这又是属于正常的结果。因为笔记本的剩余电量显示原本就是这副样子的,其系统自带的侦测程序也有同样的问题。就目前而言,这应该属于暂时无法解决的问题吧。
原文同步发布于我的个人博客