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

时间:2017-10-08 00:55:31

标签: java c linux operating-system x11

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

Firefox -> 20 minutes 
Text editor -> 5 minutes

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

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

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

使用Fedora 26,

提前致谢。

2 个答案:

答案 0 :(得分:2)

  1. 是否应用程序最小化&#34;是 NOT Linux进程的属性。相反,它由您的桌面管理员管理:软件(例如Gnome),后者又位于X Windows之上。

  2. 换句话说,找出最小化的应用程序&#34;哪些不是,你通常要查询X Windows。例如:

  3.   

    How can you check if a window is minimized via the terminal in linux

    if xwininfo -all -id $windowIdGoHere |grep "Hidden"; then
      echo "is hidden"
    fi
    
    1. 应该&#34; xwininfo&#34;为你工作...然后你当然可以用Java来调用它,例如使用Process p = Runtime.getRuntime().exec(...)

答案 1 :(得分:2)

感谢贡献者,我找到了解决方案来完成我的要求。我发现this 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