繁体   English   中英

如何使用Java获取应用程序的GUI活动

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM