2010-03-10 63 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; 
    } 
    } 
}