最终,我想确定我的程序运行的机器是笔记本电脑还是台式机。我想用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);
}
感谢, 埃里克
此代码运行,但它输出“盖存在:真正的”我运行在每一台电脑上。 –
枚举何去何从? –
@ErikB有没有解决这个问题的运气?我面临着一个类似的问题。请同时回答Bjarke Freund-Hansen的问题,因为它在你的第二篇文章中被明显地忽略了。谢谢 – amadib