2017-10-08 100 views
5

我想記錄活動的應用程序並保存活動應用程序的歷史記錄。我說積極的應用程序,因爲如果我運行一個應用程序,它最小化等,我不會把它算作一個活躍的應用程序。 爲了讓我的問題更清晰,讓我們看看這個例子。 我打開Firefox並在網上衝浪20分鐘。然後我打開一個文本編輯器並開始寫5分鐘(Firefox正在運行,但我沒有使用它,所以Firefox不應該算作一個活動的應用程序)。所以,我應該能夠記錄以下信息:如何使用C/java檢測活動應用程序?

Firefox -> 20 minutes 
Text editor -> 5 minutes 

我想要跟蹤的OS在每個使用的應用程序(Linux是首選)是做出一個開源應用程序,說你有多少使用每個應用程序。

更新:我想記錄的應用程序是用戶在顯示器上看到並正在處理的應用程序。例如,你可以改變窗口的大小,以便你可以看到Firefox和文本編輯器(在不同的工作空間,級聯等),但你在文本編輯器中輸入,因此,文本編輯器是主動應用程序換句話說,如果您正在與之交互或是您正在查看的最後一個交互應用程序閱讀pdf,文本等中的某些內容,則應用程序處於活動狀態。與應用程序交互:我的意思是單擊,鍵入,滾動等。

NAROWING:我唯一不知道的是如何獲得這些條件下的活動應用程序。我認爲,如果我在當前工作空間的顯示器上獲得最能解決問題的最高應用程序,那麼我們有一個屬性可以設置爲一個窗口(總是在頂部),可能需要在未啓用此屬性的情況下才能獲得該窗口。我發現this question可能有助於回答。

使用Fedora 26,

在此先感謝。

+1

沒有核心的Java解決方案,因爲Java已經專門編寫成因爲OS儘可能不可知。對於解決方案,您需要使用第三方庫(非主題)或使用通過JNI/JNA鏈接到Java的C/C++解決方案。 –

+0

...也沒有OS命令,你可以用你的操作系統標記你的問題? – 2017-10-08 01:06:29

+0

@SamDev你不會找到它,因爲它是一個多部分問題,涉及到進行C或C++調用,然後通過JNI或JNA鏈接到它們。最好的鏈接將在本網站的C/C++部分。我認爲,在進行足夠深入的研究之前,OP還沒有足夠的背景知識,甚至沒有足夠的背景來刺激這一點。如果這不是重複的,應該關閉太寬。 –

回答

2
  1. 無論應用程序是「最小化」是的Linux進程的屬性。相反,它由您的「桌面管理器:軟件(例如Gnome)管理,而後者又位於X Windows之上。

  2. 換句話說,要找到哪些應用程序」最小化「要查詢的X Windows,例如:

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 
  • 應該「 xwininfo「爲你工作...那麼你肯定可以從Java調用它,例如通過使用Process p = Runtime.getRuntime().exec(...)
  • +0

    爲什麼我應該獲得最小化的應用程序? – Martin

    +2

    再次說明:從操作系統的角度來看,您的應用程序「始終在運行」。無論是「最小化」(我認爲從您的原始描述)或只是「不重點」...是您的桌面窗口管理器的屬性。對於Linux,我們通常使用X Windows來實現。所以對於Linux來說,「X windows」可能就是你想要看的地方。而「xwininfo」是一個很好的開始。 '希望有所幫助。 – paulsm4

    +0

    謝謝,我發現另一個命令'xdotool'並根據​​你的回答提供了一個解決方案。 – Martin

    1

    感謝貢獻者,我找到了解決方案來完成我所要求的工作。我發現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 
    
    相關問題