Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java获取应用程序的GUI活动_Java_User Interface_Netbeans_Java Native Interface_Jna - Fatal编程技术网

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

如何使用Java获取应用程序的GUI活动,java,user-interface,netbeans,java-native-interface,jna,Java,User Interface,Netbeans,Java Native Interface,Jna,是否有一种方法可以跟踪Java中给定应用程序的gui空闲和活动。我使用C#完成了这项工作,参考本教程: 如何在Java中实现它?这个答案适用于Windows 以下是一些应该让您开始学习的片段。此代码仅为示例,不完整。完整的解决方案是冗长的 从Java跳转到本机端并调用 CallNtPowerInformation()请求SystemPowerInformation。 将结果传递到Java端 ntStatus = CallNtPowerInformation(SystemPowerInfo

是否有一种方法可以跟踪Java中给定应用程序的gui空闲和活动。我使用C#完成了这项工作,参考本教程:
如何在Java中实现它?

这个答案适用于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 + "%"));
这是一个静态视图。当然,真正的观点是动态的

有不同程度的空闲和忙碌。例如,30%的怠速比5%的怠速更怠速。
忙的时候也一样。50%的忙比5%的忙更忙。您在图像中看到的睡眠计时器是允许计算机睡眠或休眠时的倒计时计时器。所有数据都来自操作系统。

如果可以修改应用程序,则可以安装自己的EventQueue--处理UI事件和绘制请求。如果无法更改应用程序,您仍然可以使用JVMTI()执行类似的操作。实现会有点困难。

如果您只想监视java应用程序的活动,Radim的答案是正确的。如果您想按照装满鳗鱼的气垫船的建议监视整个系统的用户活动,您将需要一些本机代码。您应该能够利用类似的功能来实现后者。

这需要您直接与操作系统(OS)通信,而且由于Java的构建尽可能不依赖操作系统,因此使用Java实现这一点并不容易。如果这个功能是绝对必要的,请考虑使用JNI或JNA(我的首选)来帮助您。谷歌可以引导你找到关于这些家伙的教程。非常感谢你的回答。有没有办法跟踪用户是否打开了一个应用程序,而该应用程序闲置了很长时间?我的意思是应用程序空闲多长时间以及它消耗了多少mcuh内存?好吧,上面的解决方案是针对系统空闲/繁忙的。因此,如果用户不使用计算机,计算机将切换到空闲状态。但如果用户停止使用您的应用程序,并开始使用另一个应用程序,则解决方案将报告繁忙。那么,当你说“应用程序空闲了多长时间”时,你的意思是主JFrame已经更新多久了?或者用户按下一个键已经多久了?或者用户使用鼠标已经多久了?或者什么?我没有查看我的Java应用程序。我想监视任何正在运行但空闲的应用程序。空闲可以通过按键或鼠标移动后的时间来确定。我不知道Java应用程序如何监视任意应用程序的键盘和鼠标活动。您的问题应该是“如何监视任意(Java或非Java)应用程序的键盘和鼠标?”现在……想想您的问题。应用程序监控你的应用程序怎么样。当您登录到您的银行帐户时,了解您的浏览器键盘活动,您对此应用有何感受?