如何在Windows系统中获得剩余电量? [英] How to get the remaining battery life in a Windows system?

查看:150
本文介绍了如何在Windows系统中获得剩余电量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在Windows系统中获得剩余电量。我怎么能这样做?

I need to get the remaining battery life in a Windows system. How can I do it?

推荐答案

我假设你在谈论一台笔记本电脑。 Standard Java SE API中不存在此类API。此信息仅在操作系统平台本机API中提供。您至少需要 JNI JNA (JavaWorld文章)能够与平台本机API进行通信。

I assume you're talking about a laptop. No such API exist in Standard Java SE API. This information is available in the operating system platform native API only. You would need at least JNI or JNA (JavaWorld article) to be able to communicate with platform native API.

在Windows中,您想要挂钩 SYSTEM_POWER_STATUS 结构。它提供了 BatteryLifePercent 属性,这可能是您感兴趣的。我在旧的forums.sun.com主题中找到了一个有用的基于JNA的代码片段,目前暂不可用。因此,信用证实际上归于其名称不可知的作者。

In Windows, you'd like to hook on SYSTEM_POWER_STATUS structure. It offers among others the BatteryLifePercent property which may be of your interest. I found a helpful JNA based code snippet in an old forums.sun.com topic which is currently not available anymore. So the credit actually goes to the Author Whose Name Shall Not Be Known.

要使其工作,请首先删除 jna.jar 然后将未修改的以下类复制到项目中:

To get it to work, first drop jna.jar in the classpath and then copy the following class unmodified into your project:

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 Kernel32 extends StdCallLibrary {

    public Kernel32 INSTANCE = (Kernel32) Native.loadLibrary("Kernel32", Kernel32.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()方法中:

Here's how you can use it, e.g. in your main() method:

Kernel32.SYSTEM_POWER_STATUS batteryStatus = new Kernel32.SYSTEM_POWER_STATUS();
Kernel32.INSTANCE.GetSystemPowerStatus(batteryStatus);

System.out.println(batteryStatus); // Shows result of toString() method.

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

This prints successfully the following at my Latitude E5500:


ACLineStatus: Online
Battery Flag: High, more than 66 percent
Battery Life: 100%
Battery Left: Unknown
Battery Full: Unknown

在关闭AC 10分钟后:

And after plugging off the AC for 10 minutes:


ACLineStatus: Offline
Battery Flag: High, more than 66 percent
Battery Life: 82%
Battery Left: 2954 seconds
Battery Full: Unknown

(不,没有坏电池,我只是编辑电影并且现在不断通过wifi传输;)

(no, no bad battery, I am just compiling a movie and continuously transferring over wifi right now ;) )

这篇关于如何在Windows系统中获得剩余电量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆