2009-07-21 259 views
5

我正在開發一個應用程序,用於監控筆記本電腦的電源是否存在。如果有電力削減或恢復,它會通過電子郵件將我私密化。它也將通過電子郵件進行應用程序監視和控制(基本上是通過電子郵件從我的辦公室控制筆記本電腦)。我完成了電子郵件接口,但我不知道如何監控來自java的電源/電池電源。從java監控筆記本電腦或筆記本電腦電源

如果有任何可以給這個指針,這將是很大的幫助。

在此先感謝....

+1

這將有助於瞭解平臺(OS),因爲這可能是平臺特定的。 – jsight 2009-07-21 17:08:06

+0

只是好奇你爲什麼用這個動詞親密?這聽起來很奇怪。你的意思是使用另一個詞或是某種電子郵件API? – Victor 2009-07-21 17:57:38

回答

5

您可能已經解決了這個問題,但對於其他人 - 你可以做到這一點亞當Crume暗示的方式,使用已編寫腳本battstat.bat爲Windows XP和更高版本。 這裏所得到的函數的例子:

private Boolean runsOnBattery() { 
    try { 
     Process proc = Runtime.getRuntime().exec("cmd.exe /c battstat.bat"); 

     BufferedReader stdInput = new BufferedReader(
      new InputStreamReader(proc.getInputStream())); 

     String s; 
     while ((s = stdInput.readLine()) != null) { 
      if (s.contains("mains power")) { 
       return false; 
      } else if (s.contains("Discharging")) { 
       return true; 
      } 
     } 
    } catch (IOException ex) { 
     Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    return false; 
} 

也可以簡單腳本直接返回真/假或任何適合。

0

處理這個問題的一種快速和骯髒的方法是調用本機程序(通過Runtime.exec(...))並解析輸出。在Windows上,本機程序可能是使用WMI的VBScript。

2

在Linux上,你可以用的/ proc/ACPI /電池/

0

下面是使用SYSTEM_POWER_STATUS結構在Windows上工作的代碼。

請注意,您需要將jna添加到您的(Maven)依賴項才能生效。

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

    public class SYSTEM_POWER_STATUS extends Structure 
    { 
     public byte ACLineStatus; 

     @Override 
     protected List<String> getFieldOrder() 
     { 
      ArrayList<String> fields = new ArrayList<String>(); 
      fields.add("ACLineStatus"); 

      return fields; 
     } 

     public boolean isPlugged() 
     { 
      return ACLineStatus == 1; 
     } 
    } 

    public int GetSystemPowerStatus(SYSTEM_POWER_STATUS result); 
} 

在你的代碼中調用它像這樣:

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

System.out.println(batteryStatus.isPlugged()); 

結果:

true if charger is plugged in false otherwise 

這已經推導過BalsusC's answer

相關問題