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

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

Firefox -> 20 minutes Text editor -> 5 minutes 

我希望在操作系统(Linux是首选)时跟踪每个使用的应用程序,并开发一个开源应用程序,说明您使用每个应用程序的次数。

更新:我想logging的应用程序是用户在显示器上看到并正在使用的应用程序。 例如,你可以改变窗口的大小,这样你就可以同时看到Firefox和文本编辑器(在不同的工作空间,级联等),但是你正在input文本编辑器,所以文本编辑器是主动应用程序 换句话说,如果您正在与之交互,或者您正在查看以PDF,文本等方式阅读某些内容的应用程序,则此应用程序处于活动状态。与应用程序进行交互:指的是单击,键入,滚动等。

纳诺:唯一不能弄清楚的是如何在这些条件下获得积极的应用。 我认为,如果我在当前工作空间的显示器上获得最高的应用程序来解决问题,那么我们有一个属性可以设置为一个窗口(总是在最前面),可能需要在没有启用该属性的情况下才能获得该窗口。 我发现这个问题可能有助于回答。

使用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链接。 我将使用java来构建它。 首先,我找到了这个用C语言做类似工作的qithub 。 但是,我想用java(我更喜欢它,因为maven和JavaFX)。 顺便说一句,让我知道如果我错了。

  /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.sinusee.applinebuilder; import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.TimeUnit; /** * * @author martin */ public class Main { /** * @param args the command line arguments */ private static final DateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); public static void main(String[] args) throws IOException, InterruptedException { // TODO code application logic here System.out.println("Start :"); Date date = new Date(); do{ 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); }while(true); } } 

它每10秒返回活动的窗口名称(这只是一个测试)。 它正在使用的应用程序的标题如下。

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