IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Détecter si une fenêtre spécifique a le focus


Sujet :

Langage Java

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2013
    Messages : 19
    Par défaut Détecter si une fenêtre spécifique a le focus
    Bonjour à tous,

    J'ai une demande toute particulière qu'il me faudrait résoudre dans exactement "il y a une semaine". Le problème est le suivant :

    Je suis en train de créer un logiciel qui doit détecter si un programme spécifique ( dans mon test : "Calc.exe") possède le focus. Si ce programme perd le focus, je dois activer un petit timer qui s'arrête des que "calc.exe" récupère le focus.

    L'un de vous aurait-il une solution ou ne serait-ce qu'une piste à me proposer, s'il vous plait?

    La chose semble pourtant bête : on dit au programme : "Surveilles le focus de ce programme là -> calc.exe, et démarre le compteur dès qu'il le perd."

    J'ai cherché dans la doc java, sur google, mon copain, mais entre deux sites parlant de javascript, je ne trouve que des sites parlant de VB.NET. Hors, moi, javascript, c'est pas le langage que je DOIS utiliser et VB.NET m'est aussi familié que la fusion nucléaire de particules de Unundium dans un champ de stase électromagnétique...

  2. #2
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2013
    Messages : 19
    Par défaut
    Personne ne sait comment faire? je suis certains qu'il y a un moyen, mais je ne le connais pas. Et Java a pour habitude d'être vaste.

    Je vous en prie, s'il vous plait, connaitriez-vous une manière de faire en sorte de détecter ce malheureux focus?

  3. #3
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 105
    Par défaut
    Je ne pense pas que ca soit possible de faire cela en java sans passer par une dll ou des fonctions systèmes.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2013
    Messages : 19
    Par défaut
    Voilà qui est facheux. Un ami m'a proposé de passer par un écouteur de process. Mais savoir qu'un processus tourne ne veut pas dire qu'il a le focus..

    Si éventuellement quelqu'un connait une dll ou une fonction système qui permette de faire ça, se serait super!

    J'ai aussi trouvé sur un forum quelque chose nommé JNI. Je ne sais pas encore ce que c'est, mais je vais aller voir. Qui sait? Peut-être que la solution est là.
    A la limite, j'estime possible de rajouter une couche d'un autre langage. Mais là, je dois dire que je ne m'y connais pas trop. Apparemment, comme je l'écrivais plus haut, il y aurait moyen de faire ça en VB.NET ou javascript. Mais niveau croisement langage, je m'arrête à java/BDD et C/C++ comme croisement. Là, croiser java/javascript ou java/VB.NET, je ne sais pas trop comment faire.

    Je vais me renseigner sur ça, au pire. En attendant, si quelqu'un possède la moindre piste sur comment savoir qu'un programme a le focus, s'il vous plait, n'hésitez pas. Il ne me reste qu'un mois de dev et je vois les jours fondre comme beurre dans une poêle chaude.

    Merci de m'aider, Wax78. Ce projet est assez colossal et sans aide, je risque de me prendre les deadlines en pleine face.

  5. #5
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 105
    Par défaut
    Citation Envoyé par Cdébryha Voir le message
    Mais savoir qu'un processus tourne ne veut pas dire qu'il a le focus..
    A savoir en plus qu'un processus n'as pas toujours d'interface.

    Il n'y as pas que JNI il y'a JNA aussi et google regorge de questions similaires a la tienne avec parfois des réponses.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2013
    Messages : 19
    Par défaut
    "A savoir en plus qu'un processus n'as pas toujours d'interface."

    Tu as bien raison. Mais il est vrai que je ne prenais pas cette idée en compte car le logiciel que je cherche à analyser a une interface.

    "google regorge de questions similaires a la tienne "

    Vraiment? Me voila surpris. J'ai pourtant cru être l'un des seuls à poser la question ( quoiqu'au fond je pensais aussi ne pas être le seul), et les réponses que j'avais concernaient surtout le javascript ou le VB.NET, mais je n'en ai trouvé aucune sur le java.

    Je ne connais ni JNI ni JNA. Je vais aller voir ce que c'est.

    Auriez-vous un lien ou deux à me donner pour que je puisse voir, dans l'éventualité où je ne trouve pas, s'il vous plait? Je vous remercie d'avance.

  7. #7
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 105
    Par défaut
    Oui, celui de google (c'est le premier, impossible à rater)

    Lien
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2013
    Messages : 19
    Par défaut
    C'est parfait!

    J'ai trouvé exactement ce que je cherchais. J'ai pu coupler le résultat sur mon application et oh miracle! ça marche!

    Je vous remercie beaucoup de l'aide que vous m'avez fourni. Personnellement, je rechignais à l'idée de devoir aller sur un forum pour demander de l'aide.

    je recommanderai Developpez.com aux programmeurs que je croiserai. Ici et StackOverflow, bien sûr.
    Merci beaucoup encore. Je repasserai si j'ai encore besoin d'aide.

    Cordialement,

    Cdébryha

  9. #9
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 105
    Par défaut
    De rien, ne t'inquiète pas, ici on est gentil (en général ).

    N'oublies pas de passer au statut résolu en cliquant sur le bouton a cet effet en bas de discussion.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,



    JNA est vraiment très pratique lorsqu'on souhaite appeler du code natif.
    C'est bien plus simple à mettre en place que JNI qui nécessite qu'on écrive du code natif (et donc qu'on le compile).


    C'est indiqué dans la discussion sur stackoverflow : avec JNA tu peux utiliser le platform.jar qui intègre les principales fonctions natives des principaux OS.
    Dans ton cas le plus simple est d'utiliser directement la classe com.sun.jna.platform.win32.User32 qui intègre déjà les méthodes dont tu as besoin sans avoir besoin de les définir...







    Par contre ce qui est dommage c'est qu'à chaque fois qu'il y a des exemples JNA, c'est "l'ancien modèle" basé sur des interfaces qui est utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public interface User32 extends StdCallLibrary, WinUser {
        User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class, W32APIOptions.DEFAULT_OPTIONS);
     
        HWND GetForegroundWindow();
        int GetWindowTextLength(HWND  hwnd);
        int GetWindowText(HWND  hWnd, char[] lpString, int nMaxCount);
    }
    Or pour moi cela a plusieurs défauts :
    • On est obligé de créer une instance de l'interface, qui est généré via un proxy via l'API de réflection.
    • En utilisant un INSTANCE on crée un objet permanent en mémoire...
    • Toutes les méthodes sont public (c'est une interface). On ne peut donc pas définir de méthode static/private...
    • On ne peut pas définir des méthodes en Java pure dans la même classe (il faut passer par une autre classe).




    Or dans la majorité des cas il est possible d'utiliser le Direct Mapping, qui se rapproche de l'utilisation de JNI :
    On définit une méthode "native" qui sera associé à une fonction native, et un bout de code static dans la classe associe les méthodes natives à JNA.
    Cela donnerait dans l'exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class User32 {
     
    	static {
    		Native.register(NativeLibrary.getInstance("user32", W32APIOptions.DEFAULT_OPTIONS));
    	}
     
    	public native HWND GetForegroundWindow();
    	public native int GetWindowTextLength(HWND  hwnd);
    	public native int GetWindowText(HWND  hWnd, char[] lpString, int nMaxCount);
    }
    A priori peu de différence, sauf que là on a affaire à une vrai classe (pas un proxy) que l'on peut instancier comme bon nous semble, ou même définir les méthode en private ou static...


    L'intérêt, c'est qu'il est possible de cacher des méthodes et/ou d'implémenter des versions plus simple en Java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public final class User32 {
     
    	static {
    		Native.register(NativeLibrary.getInstance("user32", W32APIOptions.DEFAULT_OPTIONS));
    	}
     
    	private User32() {
    		// Classe utilitaire qu'il n'est pas prévu d'instancier
    	}
     
    	public static native HWND GetForegroundWindow();
    	private static native int GetWindowTextLength(HWND  hwnd);
    	private static native int GetWindowText(HWND  hWnd, char[] lpString, int nMaxCount);
     
    	public static String getWindowText(HWND  hwnd) {
    		int length = GetWindowTextLength(hwnd) + 1;
            char[] title = new char[length];
            GetWindowText(hwnd, title, length);
            return Native.toString(title);
    	}
     
    	public static String getForegoundWindowText() {
    		return getWindowText(GetForegroundWindow());
    	}
    }
    Je trouve dommage que ceci ne soit pas mis en avant...


    a++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. détecter si une fenètre est ouverte et si oui la fermer
    Par malabarbe dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 29/02/2008, 12h36
  2. [JTable] Détecter qu'une case a obtenu le focus
    Par nicou_doude dans le forum Composants
    Réponses: 2
    Dernier message: 24/01/2008, 11h03
  3. Ouverture d'une url dans une fenêtre spécifique
    Par jpbourgeois dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 15/09/2006, 23h54
  4. Détecter si une fenêtre est déjà ouverte et aller dedans
    Par thierry198 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 24/11/2005, 18h53
  5. empêcher une fenêtre de perdre le focus (MDI)
    Par eponette dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/08/2005, 17h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo