如何在Windows系统中获得剩余的电池寿命?

我需要在Windows系统中获得剩余的电池寿命。 我该怎么做?

我假设你正在谈论一台笔记本电脑。 标准Java SE API中不存在这样的API。 该信息仅在操作系统平台本机API中可用。 您至少需要JNI或JNA (JavaWorld文章)才能与平台本机API进行通信。

在Windows中,您想挂钩SYSTEM_POWER_STATUS结构 。 它提供BatteryLifePercent物业,其中可能是你的利益。 我在旧的forums.sun.com主题中发现了一个有用的基于JNA的代码片段,目前不再可用。 所以这个信用实际上是写给那些不知名的作者的。

要使其工作,首先将jna.jar放入classpath中,然后将以下未经修改的类复制到您的项目中:

 package com.example; import java.util.ArrayList; import java.util.List; import com.sun.jna.Native; import com.sun.jna.Structure; import com.sun.jna.win32.StdCallLibrary; public interface coreel32 extends StdCallLibrary { public coreel32 INSTANCE = (coreel32) Native.loadLibrary("coreel32", coreel32.class); /** * @see http://msdn2.microsoft.com/en-us/library/aa373232.aspx */ public class SYSTEM_POWER_STATUS extends Structure { public byte ACLineStatus; public byte BatteryFlag; public byte BatteryLifePercent; public byte Reserved1; public int BatteryLifeTime; public int BatteryFullLifeTime; @Override protected List<String> getFieldOrder() { ArrayList<String> fields = new ArrayList<String>(); fields.add("ACLineStatus"); fields.add("BatteryFlag"); fields.add("BatteryLifePercent"); fields.add("Reserved1"); fields.add("BatteryLifeTime"); fields.add("BatteryFullLifeTime"); return fields; } /** * The AC power status */ public String getACLineStatusString() { switch (ACLineStatus) { case (0): return "Offline"; case (1): return "Online"; default: return "Unknown"; } } /** * The battery charge status */ public String getBatteryFlagString() { switch (BatteryFlag) { case (1): return "High, more than 66 percent"; case (2): return "Low, less than 33 percent"; case (4): return "Critical, less than five percent"; case (8): return "Charging"; case ((byte) 128): return "No system battery"; default: return "Unknown"; } } /** * The percentage of full battery charge remaining */ public String getBatteryLifePercent() { return (BatteryLifePercent == (byte) 255) ? "Unknown" : BatteryLifePercent + "%"; } /** * The number of seconds of battery life remaining */ public String getBatteryLifeTime() { return (BatteryLifeTime == -1) ? "Unknown" : BatteryLifeTime + " seconds"; } /** * The number of seconds of battery life when at full charge */ public String getBatteryFullLifeTime() { return (BatteryFullLifeTime == -1) ? "Unknown" : BatteryFullLifeTime + " seconds"; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("ACLineStatus: " + getACLineStatusString() + "\n"); sb.append("Battery Flag: " + getBatteryFlagString() + "\n"); sb.append("Battery Life: " + getBatteryLifePercent() + "\n"); sb.append("Battery Left: " + getBatteryLifeTime() + "\n"); sb.append("Battery Full: " + getBatteryFullLifeTime() + "\n"); return sb.toString(); } } /** * Fill the structure. */ public int GetSystemPowerStatus(SYSTEM_POWER_STATUS result); } 

以下是您可以如何使用它,例如在您的main()方法中:

 coreel32.SYSTEM_POWER_STATUS batteryStatus = new coreel32.SYSTEM_POWER_STATUS(); coreel32.INSTANCE.GetSystemPowerStatus(batteryStatus); System.out.println(batteryStatus); // Shows result of toString() method. 

在我的Latitude E5500上成功打印以下内容:

 ACLineStatus:联机
电池标志:高,超过66%
电池寿命:100%
电池左:未知
电池已满:未知

关闭交流电10分钟后:

 ACLineStatus:脱机
电池标志:高,超过66%
电池寿命:82%
电池剩余时间:2954秒
电池已满:未知

(不,没有坏的电池,我只是编写一个电影,并不断转移通过WiFi现在;))