2010-03-10 100 views
3

最終,我想確定我的程序運行的機器是筆記本電腦還是臺式機。我想用JNA和msn的PowrProf庫,GetPwrCapabilities Function使用LidPresent標誌來做到這一點。在SYSTEM_POWER_CAPABILITIES結構的帶有複雜結構的JNA

部分(這對GetPwrCapabilities()方法的參數)

BYTE     spare2[3]; 
    BYTE     spare3[8]; 
    BATTERY_REPORTING_SCALE BatteryScale[3]; 
    SYSTEM_POWER_STATE  AcOnLineWake; 

的SYSTEM_POWER_STATE枚舉:

typedef enum _SYSTEM_POWER_STATE { 
    PowerSystemUnspecified = 0, 
    PowerSystemWorking  = 1, 
    PowerSystemSleeping1  = 2, 
    PowerSystemSleeping2  = 3, 
    PowerSystemSleeping3  = 4, 
    PowerSystemHibernate  = 5, 
    PowerSystemShutdown  = 6, 
    PowerSystemMaximum  = 7 
} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE; 

枚舉在這裏解釋的SO,但我不知道如果我這樣做是正確的,因爲我得到這個錯誤:

Exception in thread "main" java.lang.IllegalArgumentException: Invalid Structure field in class JNAPlayground$PowrProf$SYSTEM_POWER_CAPABILITIES, field name 'AcOnLineWake', interface JNAPlayground$PowrProf$SYSTEM_POWER_STATE: The type "JNAPlayground$PowrProf$SYSTEM_POWER_STATE" is not supported: Native size for type "JNAPlayground$PowrProf$SYSTEM_POWER_STATE" is unknown

請您指導我或點我在正確的方向爲:
- 該陣列
- 枚舉(如果我有這個毛病)
- 如果我沒有足夠的導入庫

我的Java代碼所以迄今:

public interface PowrProf extends StdCallLibrary 
{ 
    PowrProf INSTANCE = (PowrProf) Native.loadLibrary(
      "C:\\WINDOWS\\system32\\PowrProf.dll", PowrProf.class); 

    public static interface SYSTEM_POWER_STATE 
    { 
     public static final int owerSystemUnspecified = 0; 
     public static final int PowerSystemWorking = 1; 
     public static final int PowerSystemSleeping1 = 2; 
     public static final int PowerSystemSleeping2 = 3; 
     public static final int PowerSystemSleeping3 = 4; 
     public static final int PowerSystemHibernate = 5; 
     public static final int PowerSystemShutdown = 6; 
     public static final int PowerSystemMaximum = 7; 

    } 

    public static class BATTERY_REPORTING_SCALE extends Structure 
    { 
     public long Granularity; 
     public long Capacity; 
    } 

    public static class SYSTEM_POWER_CAPABILITIES extends Structure 
    { 
     public boolean PowerButtonPresent; 
     public boolean SleepButtonPresent; 
     public boolean LidPresent; 
     public boolean SystemS1; 
     public boolean SystemS2; 
     public boolean SystemS3; 
     public boolean SystemS4; 
     public boolean SystemS5; 
     public boolean HiberFilePresent; 
     public boolean FullWake; 
     public boolean VideoDimPresent; 
     public boolean ApmPresent; 
     public boolean UpsPresent; 
     public boolean ThermalControl; 
     public boolean ProcessorThrottle; 
     public int ProcessorMinThrottle; 
     public int ProcessorMaxThrottle; 
     public boolean FastSystemS4; 
     public int spare2[] = new int[3]; 
     public boolean DiskSpinDown; 
     public int spare3[] = new int[8]; 
     public boolean SystemBatteriesPresent; 
     public boolean BatteriesAreShortTerm; 
     public BATTERY_REPORTING_SCALE BatteryScale[] = new BATTERY_REPORTING_SCALE[3]; 
     public SYSTEM_POWER_STATE AcOnLineWake; 
     public SYSTEM_POWER_STATE SoftLidWake; 
     public SYSTEM_POWER_STATE RtcWake; 
     public SYSTEM_POWER_STATE MinDeviceWakeState; 
     public SYSTEM_POWER_STATE DefaultLowLatencyWake; 
    } 

    void GetPwrCapabilities(SYSTEM_POWER_CAPABILITIES result); 
} 

感謝, 埃裏克

回答

1

此前谷歌的H ** L out輸出的這一點,我想重溫JNA的主網頁,並在這裏忽略其他枚舉問題所以。枚舉的映射是here。我的代碼現在顯示蓋子存在!

import com.sun.jna.Native; 
import com.sun.jna.Structure; 
import com.sun.jna.win32.StdCallLibrary; 

public class JNAPlayground 
{ 

    public interface PowrProf extends StdCallLibrary 
    { 
     PowrProf INSTANCE = (PowrProf) Native.loadLibrary(
       "C:\\WINDOWS\\system32\\PowrProf.dll", PowrProf.class); 

     public static class BATTERY_REPORTING_SCALE extends Structure 
     { 
      public long Granularity; 
      public long Capacity; 
     } 

     public static class SYSTEM_POWER_CAPABILITIES extends Structure 
     { 
      public boolean PowerButtonPresent; 
      public boolean SleepButtonPresent; 
      public boolean LidPresent; 
      public boolean SystemS1; 
      public boolean SystemS2; 
      public boolean SystemS3; 
      public boolean SystemS4; 
      public boolean SystemS5; 
      public boolean HiberFilePresent; 
      public boolean FullWake; 
      public boolean VideoDimPresent; 
      public boolean ApmPresent; 
      public boolean UpsPresent; 
      public boolean ThermalControl; 
      public boolean ProcessorThrottle; 
      public int ProcessorMinThrottle; 
      public int ProcessorMaxThrottle; 
      public boolean FastSystemS4; 
      public int spare2[] = new int[3]; 
      public boolean DiskSpinDown; 
      public int spare3[] = new int[8]; 
      public boolean SystemBatteriesPresent; 
      public boolean BatteriesAreShortTerm; 
      public BATTERY_REPORTING_SCALE BatteryScale[] = new BATTERY_REPORTING_SCALE[3]; 
      public int AcOnLineWake; 
      public int SoftLidWake; 
      public int RtcWake; 
      public int MinDeviceWakeState; 
      public int DefaultLowLatencyWake; 
     } 

     void GetPwrCapabilities(SYSTEM_POWER_CAPABILITIES result); 
    } 

    public static void main(String[] args) 
    { 
     PowrProf lib2 = PowrProf.INSTANCE; 
     PowrProf.SYSTEM_POWER_CAPABILITIES systemPOWERCAPABILITIES = new PowrProf.SYSTEM_POWER_CAPABILITIES(); 
     lib2.GetPwrCapabilities(systemPOWERCAPABILITIES); 

     System.out.println("Lid present:" + systemPOWERCAPABILITIES.LidPresent); 
    } 
} 
+1

此代碼運行,但它輸出「蓋存在:真正的」我運行在每一臺電腦上。 –

+0

枚舉何去何從? –

+0

@ErikB有沒有解決這個問題的運氣?我面臨着一個類似的問題。請同時回答Bjarke Freund-Hansen的問題,因爲它在你的第二篇文章中被明顯地忽略了。謝謝 – amadib

-1
import com.sun.jna.Native; 
import com.sun.jna.Structure; 
import com.sun.jna.win32.StdCallLibrary; 

public class SystemProfilerWindowsImpl 
{ 
    public static void main(String[] args) 
    { 
    Log.info("SystemProfilerWindowsImpl", "main", "is laptop:" + isLaptop()); 
    } 

    public static boolean isLaptop() 
    { 
    byte batteryFlag = getBatteryFlag(); 
    boolean isLaptop = false; 

    if (batteryFlag == -128) 
    { 
     Log.debug("batt flag - no batt"); 
    } 
    else if (batteryFlag == -1) 
    { 
     Log.debug("batt flag - unknown"); 
    } 
    else 
    { 
     Log.debug("battery flag " + batteryFlag); 
     isLaptop = true; 
    } 
    return isLaptop; 
    } 

    private static byte getBatteryFlag() 
    { 
    Kernel32 lib = Kernel32.INSTANCE; 
    SystemProfilerWindowsImpl.Kernel32.SYSTEM_POWER_STATUS status = new SystemProfilerWindowsImpl.Kernel32.SYSTEM_POWER_STATUS(); 
    lib.GetSystemPowerStatus(status); 
    if (status.BatteryLifePercent == -1) 
    { 
     Log.debug("battery life percent is unknown"); 
    } 
    else 
    { 
     Log.debug("battery life percent is " + status.BatteryLifePercent); 
    } 

    byte batteryFlag = status.BatteryFlag; 
    return batteryFlag; 
    } 

    public String getModel() 
    { 
    if (isLaptop()) 
    { 
     return "WinLaptop"; 
    } 

    return "WinDesktop"; 
    } 

    public static abstract interface Kernel32 extends StdCallLibrary 
    { 
    public static final Kernel32 INSTANCE = (Kernel32)Native.loadLibrary("kernel32", 
     Kernel32.class); 

    public abstract void GetSystemPowerStatus(SYSTEM_POWER_STATUS paramSYSTEM_POWER_STATUS); 

    public static class SYSTEM_POWER_STATUS extends Structure 
    { 
     public byte ACLineStatus; 
     public byte BatteryFlag; 
     public byte BatteryLifePercent; 
     public byte Reserved1; 
     public int BatteryLifeTime; 
     public int BatteryFullLifeTime; 
    } 
    } 
}