[英]How to get the GUI activity of an application using Java
有没有一种方法可以跟踪Java中给定应用程序的gui空闲和活动。 我已使用C#并参考本教程来完成此操作: http : //www.codeproject.com/Articles/13756/Detecting-Application-Idleness如何在Java中实现?
如果可以修改应用程序,则可以安装自己的EventQueue- http: //docs.oracle.com/javase/7/docs/api/java/awt/EventQueue.html#push( java.awt.EventQueue) -处理UI事件和绘画请求。 如果无法更改应用程序,您仍然可以使用JVMTI( http://docs.oracle.com/javase/7/docs/technotes/guides/jvmti/ )做类似的事情。 实施会有些困难。
此答案适用于Windows。
以下是一些片段,可以帮助您入门。 该代码仅作为示例,并不完整。 完整的解决方案很冗长。
从Java跳转到本机端,然后调用CallNtPowerInformation()来请求SystemPowerInformation。 将结果传递到Java端。
ntStatus = CallNtPowerInformation(SystemPowerInformation, lpInputBuffer, nInputBufferSize, &systemPowerInformation, systemPowerInformationSize);
success = ntStatus == STATUS_SUCCESS;
if (success == FALSE) {
logErrorMessage(thisFunctionName, ntStatus);
} else {
SYSTEM_POWER_INFORMATION * p = (SYSTEM_POWER_INFORMATION *) &systemPowerInformation;
javaDefineLong(env, o, "SYSTEM_POWER_INFORMATION.CoolingMode", 0, p->CoolingMode);
javaDefineLong(env, o, "SYSTEM_POWER_INFORMATION.Idleness", 0, p->Idleness);
javaDefineLong(env, o, "SYSTEM_POWER_INFORMATION.TimeRemaining", 0, p->TimeRemaining);
javaDefineLong(env, o, "SYSTEM_POWER_INFORMATION.MaxIdlenessAllowed", 0, p->MaxIdlenessAllowed);
}
对ProcessorInformation执行相同的操作。
ntStatus = CallNtPowerInformation(ProcessorInformation, lpInputBuffer, nInputBufferSize, &processorPowerInformation, processorPowerInformationSize);
success = ntStatus == STATUS_SUCCESS;
if (success == FALSE) {
logErrorMessage(thisFunctionName, ntStatus);
} else {
int x;
for (x=0; x!=32; x++) {
PROCESSOR_POWER_INFORMATION * p = (PROCESSOR_POWER_INFORMATION *) &(processorPowerInformation[x]);
if (x != p->Number) {
break;
}
else {
javaDefineLong(env, o, "PROCESSOR_POWER_INFORMATION.CurrentIdleState", x, p->CurrentIdleState);
javaDefineLong(env, o, "PROCESSOR_POWER_INFORMATION.CurrentMhz", x, p->CurrentMhz);
javaDefineLong(env, o, "PROCESSOR_POWER_INFORMATION.MaxIdleState", x, p->MaxIdleState);
javaDefineLong(env, o, "PROCESSOR_POWER_INFORMATION.MaxMhz", x, p->MaxMhz);
javaDefineLong(env, o, "PROCESSOR_POWER_INFORMATION.MhzLimit", x, p->MhzLimit);
javaDefineLong(env, o, "PROCESSOR_POWER_INFORMATION.Number", x, p->Number);
}
}
}
对SystemPowerPolicyCurrent执行相同的操作。
ntStatus = CallNtPowerInformation(SystemPowerPolicyCurrent, lpInputBuffer, nInputBufferSize, &systemPowerPolicy, systemPowerPolicySize);
success = ntStatus == STATUS_SUCCESS;
if (success == FALSE) {
logErrorMessage(thisFunctionName, ntStatus);
} else {
SYSTEM_POWER_POLICY * p = (SYSTEM_POWER_POLICY *) &systemPowerPolicy;
javaDefineLong(env, o, "SYSTEM_POWER_POLICY.VideoTimeout", 0, p->VideoTimeout);
javaDefineLong(env, o, "SYSTEM_POWER_POLICY.IdleTimeout", 0, p->IdleTimeout);
javaDefineLong(env, o, "SYSTEM_POWER_POLICY.LidClose.Action", 0, p->LidClose.Action);
javaDefineLong(env, o, "SYSTEM_POWER_POLICY.IdleSensitivity", 0, p->IdleSensitivity);
javaDefineLong(env, o, "SYSTEM_POWER_POLICY.PowerButton.Action", 0, p->PowerButton.Action);
}
回到Java端。 计算空闲和忙碌。
final long id = Java2WinPower.longs.get("SYSTEM_POWER_INFORMATION.Idleness.0").longValue();
final long is = Java2WinPower.longs.get("SYSTEM_POWER_POLICY.IdleSensitivity.0").longValue();
final float aboveT = id - is;
final float belowT = is - id;
final float hi = 100 - is;
final float lo = is;
final int a = (int) ((aboveT / hi) * 100);
final int b = (int) ((belowT / lo) * 100);
textID.setText(a == b ? "" : a > b ? ("Idle:" + a + "%") : ("Busy:" + b + "%"));
这是静态视图。 当然,实际视图是动态的。
有闲置和忙碌的程度。 例如,与5%的空闲相比,30%的空闲更为闲置。 繁忙也一样。 繁忙50%比繁忙5%更忙。 当计算机被允许进入睡眠或休眠状态时,您在图像中看到的SleepTimer是一个倒数计时器。 所有数据均来自操作系统。
如果您只想监视Java应用程序的活动,则Radim的答案是正确的。 如果您希望按照Hovercraft Full Of Eels的建议监视整个系统的用户活动,则将需要一些本机代码。 您应该能够利用JNativeHook之类的工具来完成后者。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.