最终我想确定我的程序运行的机器是笔记本电脑还是台式机。我想用JNA和msn的PowrProf lib GetPwrCapabilities Function使用LidPresent标志来做这个。
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 );
}
谢谢, 埃里克
答案 0 :(得分:1)
在google h ** l之后,我尝试重新访问jna的主要网页,而忽略了其他关于SO的问题。枚举的映射是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 :(得分:-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;
}
}
}