簡體   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