2010-08-08 15 views
19

मुझे विंडोज सिस्टम में शेष बैटरी जीवन प्राप्त करने की आवश्यकता है। मैं यह कैसे कर सकता हूं?विंडोज सिस्टम में शेष बैटरी जीवन कैसे प्राप्त करें?

+2

आपका मतलब है बैटरी की ताकत? इसके अलावा, विंडोज का क्या संस्करण? –

+5

क्या यह ओएस स्वतंत्र नहीं होना चाहिए? – thelost

उत्तर

37

मुझे लगता है कि आप एक लैपटॉप के बारे में बात कर रहे हैं। मानक जावा एसई एपीआई में ऐसी कोई एपीआई मौजूद नहीं है। यह जानकारी केवल ऑपरेटिंग सिस्टम प्लेटफार्म देशी एपीआई में उपलब्ध है। प्लेटफार्म देशी एपीआई के साथ संवाद करने में सक्षम होने के लिए आपको कम से कम JNI या JNA(JavaWorld article) की आवश्यकता होगी।

विंडोज़ में, आप SYSTEM_POWER_STATUS structure पर हुक करना चाहते हैं। यह दूसरों के बीच BatteryLifePercent संपत्ति प्रदान करता है जो आपकी रुचि का हो सकता है। मुझे एक पुराने jums आधारित कोड स्निपेट को पुराने forums.sun.com विषय में मिला जो वर्तमान में अब उपलब्ध नहीं है। तो क्रेडिट वास्तव में उस लेखक को जाता है जिसका नाम ज्ञात नहीं होगा।

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); 
} 

यहां बताया गया है कि आप इसे उपयोग कर सकते हैं, उदाहरण के लिए:

यह काम करने के लिए, पहली classpath में jna.jar ड्रॉप और फिर अपने प्रोजेक्ट में निम्नलिखित वर्ग असंशोधित नकल प्राप्त करने के लिए अपने main() विधि में: कोई

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

(नहीं,:

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

और 10 मिनट के लिए एसी बंद प्लग के बाद:

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

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

यह प्रिंट सफलतापूर्वक मेरे अक्षांश E5500 पर निम्न खराब बैटरी, मैं बस एक फिल्म संकलित कर रहा हूं और लगातार वाईफ़ाई पर लगातार स्थानांतरित कर रहा हूं;))

+1

'संरचना भरें' यह सब दिखाने के लिए मुख्य तरीका है? –

+1

@LittleChild: नहीं, यह नीचे दिए गए कोड का ब्लॉक है "यहां आप इसका उपयोग कैसे कर सकते हैं"। बस उन पंक्तियों को अपने 'मुख्य() 'में कॉपी करें। आपको 'कर्नेल 32' इंटरफ़ेस/कक्षा को संपादित करने की आवश्यकता नहीं है (यदि आवश्यक हो तो पैकेज की अपेक्षा, लेकिन यह स्पष्ट से अधिक कुछ नहीं है)। – BalusC

+0

उदाहरण प्राप्त करें बैटरीफ्लैगस्ट्रिंग() विधि थोड़ा भ्रामक हो सकती है क्योंकि संदर्भित दस्तावेज़ों में कहा गया है कि बैटरीफ्लैग में "निम्न में से एक या अधिक झंडे हो सकते हैं।" 1, 2, 4, 8, 128, और 255 सूचीबद्ध होने के साथ। ध्वज 255 नहीं होने पर प्रत्येक मान के लिए "bitwise और" का उपयोग करने के लिए एक और अधिक विश्वसनीय दृष्टिकोण हो सकता है। हालांकि, "चार्जिंग" मान (8) शायद एकमात्र चीज है जिसे आप कभी भी 1, 2, या 4 के साथ देखेंगे। –

संबंधित मुद्दे