3

最终,我想确定运行我的程序的机器是笔记本电脑还是台式机。我想使用 JNA 和 msn 的 PowrProf 库、使用 LidPresent 标志的GetPwrCapabilities 函数来执行此操作。

结构的一部分SYSTEM_POWER_CAPABILITIES(这是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;

枚举在此处进行了解释,但我不确定我是否正确执行此操作,因为我收到此错误:

线程“main”中的异常 java.lang.IllegalArgumentException:类 JNAPlayground$PowrProf$SYSTEM_POWER_CAPABILITIES 中的结构字段无效,字段名称“AcOnLineWake”,接口 JNAPlayground$PowrProf$SYSTEM_POWER_STATE:不支持类型“JNAPlayground$PowrProf$SYSTEM_POWER_STATE”:本机“JNAPlayground$PowrProf$SYSTEM_POWER_STATE”类型的大小未知

您能否指导我或为我指明正确的方向:
- 数组
- 枚举(如果我错了)
- 如果我没有导入足够的库

到目前为止我的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 );
}

谢谢,埃里克

4

2 回答 2

1

在 google 了 h**l 之后,我尝试重新访问 jna 的主网页并忽略 SO 上的其他枚举问题。枚举的映射在这里。我的代码现在显示存在盖子!

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);
    }
}
于 2010-03-10T19:34:08.273 回答
-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;
    }
  }
}
于 2014-02-14T00:58:15.240 回答