繁体   English   中英

如何使用C / java检测活动应用程序?

[英]How to detect the active application using C/java?

我想记录活动应用程序并保存活动应用程序的历史记录。 我说活动应用程序,因为如果我运行一个应用程序,它被最小化,等我不会把它算作一个活跃的应用程序。 为了使我的问题更清楚,让我们来看看这个例子。 我打开Firefox并在网上冲浪20分钟。 然后我打开一个文本编辑器并开始写5分钟(Firefox正在运行,但我不使用它,因此Firefox不应被视为活动应用程序)。 所以我应该能够记录以下信息:

Firefox -> 20 minutes 
Text editor -> 5 minutes

我希望在操作系统(首选Linux)期间跟踪每个使用过的应用程序,并创建一个开源应用程序,说明您使用每个应用程序的数量。

更新:我要记录的应用程序是用户在显示器上看到并正在使用的应用程序。 例如,你可以改变窗口大小,你可以看到Firefox和文本编辑器(在不同的工作空间,级联等),但你在文本编辑器中键入,因此,文本编辑器是积极的应用。 换句话说,如果您正在与应用程序进行交互,或者是您正在查看的最后一个交互式应用程序,以PDF格式,文本等方式阅读某些内容,则应用程序处于活动状态。与应用程序交互:我的意思是单击,键入,滚动等。

NARROWING:我唯一不知道的是如何在这些条件下获得活动应用程序。 我认为,如果我在当前工作区中的显示器上获得最难以解决问题的应用程序,那么我们有一个属性设置为一个窗口(总是在顶部),可能需要在没有启用此属性的情况下获取。 我发现这个问题可能有助于回答。

使用Fedora 26,

提前致谢。

  1. 应用程序是否“最小化” 不是 Linux进程的属性。 相反,它由您的“桌面管理器:软件(例如Gnome)管理,而软件又位于X Windows之上。

  2. 换句话说,要查找哪些应用程序“最小化”而哪些不是“最小化”,您通常必须查询X Windows。 例如:

如何通过linux中的终端检查窗口是否最小化

 if xwininfo -all -id $windowIdGoHere |grep "Hidden"; then echo "is hidden" fi 
  1. “xwininfo”应该适合你......那么你当然可以从Java中调用它,例如使用Process p = Runtime.getRuntime().exec(...)

感谢贡献者,我找到了解决方案来完成我的要求。 我发现这个github项目在C中做了类似的工作,然后在java中实现了一个解决方案(因为maven和JavaFX,我更喜欢它)。

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;

public class Main {
    private static final DateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    public static void main(String[] args) throws IOException, InterruptedException {
        System.out.println("Start :");

        while(true) {
            Date date = new Date();      
            Process proc = Runtime.getRuntime().exec("xdotool getactivewindow getwindowname");
            java.io.InputStream is = proc.getInputStream();
            java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
            String val = "";
            if (s.hasNext()) {
                val = s.next();
            }
            else {
                val = "";
            }
            System.out.print(val +" " + "at:");
            System.out.println(sdf.format(date));
            TimeUnit.SECONDS.sleep(10);
        }
    }
}

它每10秒返回一次活动窗口名称,并打印正在使用的应用程序的标题:

Start :
ApplineBuilder - NetBeans IDE 8.2
 at:2017/10/12 02:58:58
ApplineBuilder - NetBeans IDE 8.2
 at:2017/10/12 02:59:08
GoldenDict
 at:2017/10/12 02:59:18
 at:2017/10/12 02:59:28
How to detect the active application using C/java? - Stack Overflow - Mozilla Firefox
 at:2017/10/12 02:59:38
ApplineBuilder - NetBeans IDE 8.2
 at:2017/10/12 02:59:48
Cancel Running Task
 at:2017/10/12 02:59:58

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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