Comment détecter l'application active en utilisant C / java?


Je souhaite enregistrer l'application active et enregistrer un historique de mes applications actives. Je dis application active parce que si j'exécute une application et qu'elle est minimisée, etc., je ne la compterais pas comme une application active. Afin de rendre ma question plus claire, regardons cet exemple. J'ouvre Firefox et navigue sur le web pendant 20 minutes. Ensuite, j'ouvre un éditeur de texte et commence à écrire pendant 5 minutes (Firefox est en cours d'exécution mais je ne l'utilise pas et donc Firefox ne doit pas être compté comme un actif application). Je devrais donc pouvoir enregistrer les informations suivantes:

Firefox -> 20 minutes 
Text editor -> 5 minutes

Je veux suivre chaque application utilisée pendant que le système d'exploitation (Linux est préféré) est activé et créer une application open source qui indique combien vous utilisez chaque application.

Mise à JOUR :, l'application que je veux enregistrer, c'est l'application que l'utilisateur voit à l'écran, et pour travailler avec. Par exemple vous pouvez modifier la taille de Windows de manière à ce que vous puissiez voir à la fois Firefox et l'éditeur de texte (à côté, dans un espace de travail différent, en cascade, etc.), mais vous tapez dans l'éditeur de texte, par conséquent, l'éditeur de texte est l'application active. En d'autres termes, l'application est active si vous interagissez avec ou est la dernière application interagie que vous regardez pour lire quelque chose en pdf, texte, etc. Interagir avec l'application: je veux dire cliquer, taper, faire défiler, etc.

RÉTRÉCISSEMENT: {[7] } La seule chose que je ne peux pas comprendre est comment obtenir l'application active avec les présentes conditions. Je pense que si j'obtiens la meilleure application sur l'affichage dans l'espace de travail actuel qui résoudrait le problème, hoever, nous avons une propriété à définir sur windows (toujours en haut) qui pourrait avoir besoin d'obtenir sans cette propriété activée. J'ai trouvé cette question qui pourrait aider à répondre.

Utilisation de Fedora 26,

Merci d'avance.

Author: Martin, 2017-10-08

2 answers

  1. Si une application est "minimisée" ou non, N'EST PAS une propriété du processus Linux. Au contraire, il est géré par votre " gestionnaire de bureau: logiciel (par exemple Gnome), qui à son tour se trouve au-dessus de X Windows.

  2. En d'autres termes, pour trouver quelles applications sont "minimisées" et lesquelles ne le sont pas, vous devez généralement interroger X Windows. Par exemple:

Comment pouvez-vous vérifier si une fenêtre est minimisée via le terminal dans linux

if xwininfo -all -id $windowIdGoHere |grep "Hidden"; then
  echo "is hidden"
fi
  1. "xwininfo" devrait-il fonctionner pour vous ... ensuite, vous pouvez certainement l'appeler à partir de Java, par exemple en utilisant Process p = Runtime.getRuntime().exec(...).
 2
Author: paulsm4, 2017-10-08 04:35:14

Merci aux contributeurs, j'ai trouvé une solution pour faire ce que j'ai demandé. J'ai trouvé ce projet github qui fait un travail similaire en C, puis implémenté une solution en java (je la préfère à cause de maven et 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);
        }
    }
}

Il renvoie le nom Windows actif toutes les 10 secondes et imprime le titre de l'application utilisée:

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
 2
Author: Martin, 2018-03-07 07:11:04