2009-07-21 14 views
5

私はノートパソコンの電源の存在を監視するアプリケーションを開発しています。停電や復旧がある場合は、メールで私を親密にします。また、アプリケーションの監視と電子メールの制御(基本的に私のノートパソコンを私のオフィスから電子メールで制御する)。私は電子メールのインターフェイスでやっているが、私はどのようにJavaから電源/バッテリーの供給を監視するかについては考えていない。バッテリまたはノートパソコンの電源をJavaから監視

これにポインタを付けることができれば、大きな助けになるでしょう。事前に

おかげで....

+1

プラットフォーム固有の可能性が高いため、プラットフォーム(OS)を知ることが役立ちます。 – jsight

+0

ちょっと不思議なことに、なぜ動詞を親密に使っているのですか?それは奇妙に聞こえる。あなたは別の言葉を使うことを意味しましたか、それとも何らかの電子メールapiですか? – Victor

+0

私は窓の眺めを使用しています、そして、 "親密な"のために、タイプミスは "知らせる"べきです:$。 – vcosk

答えて

5

あなたはおそらくすでにこの問題を解決した使用することができますが、他人のために - あなたはすでに書かれたスクリプトbattstat.batを使用して、それをアダムCrumeが示唆するような方法を行うことができます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; 
} 

それとも直接True/Falseのか、何でもフィットを返すようにスクリプトを簡素化することができます。

+0

これはかなり興味深いですが、バッテリーの現在のステータスを正しく提供していないのですが、これは私が当時求めていたものです。 – vcosk

0

これを処理するための素早く汚い方法は、(Runtime.exec(...)を介して)ネイティブプログラムを呼び出し、出力を解析することです。 Windowsでは、ネイティブプログラムはWMIを使用するVBScriptである可能性があります。 Linux上で

2

、あなたは/ procの/ ACPI /バッテリー/

0

SYSTEM_POWER_STATUS構造体を使用してWindows上で動作するコードです。

これが機能するには、(Maven)依存関係にjnaを追加する必要があることに注意してください。あなたのコードで

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をオフに導出されました。

関連する問題