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

Threads & Processus C++ Discussion :

Fenêtre active de Windows ?


Sujet :

Threads & Processus C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Par défaut Fenêtre active de Windows ?
    Comment retrouver sous windows et depuis une dll quelconque, le handle de la fenêtre sur laquelle l’utilisateur est en train de travailler ?
    J’ai essayé dans l’ordre les fonctions suivantes de l’API32 :
    1.- GetActiveWindow()
    2.- GetForegroundWindow ()
    3.- GetFocus()
    4.- GetClipboardOwner()

    Seules les deux premières marchent approximativement, c'est-à-dire que si l’utilisateur n’a sur son bureau qu’une seule fenêtre du net, les deux premières fonctions donnent le HWND de la fenêtre sur laquelle il travaille, si l’utilisateur va chercher une autre fenêtre sur le net, il doit au préalable tuer la fenêtre précédente pour que les 2 premières fonctions continuent à donner le HWND de la nouvelle fenêtre.
    Par contre, si l’utilisateur a plusieurs fenêtres sur son bureau (j’entends par là des fenêtres qui n’ont aucun lien entre elles), lorsqu’il passe d’une fenêtre à l’autre le HWND fourni par les deux premières fonction ne change pas ! Ou alors c’est que windows rattache la nouvelle fenêtre active au HWND précédent ce qui serait surprenant !
    Quelqu’un a-t-il une idée sur la manière de récupérer exhaustivement le HWND de la fenêtre sur laquelle l’utilisateur travaille ?
    Merci

  2. #2
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 401
    Par défaut
    je viens de tester GetForegroundWindow, et ça marche bien, je récupère bien le handle sur la fenêtre au premier plan, quelque soit le nombre de fenêtre à l'écran.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Par défaut Fenêtre active de Windows (suite)
    Moi ça marche au début, mais dès qu'on le secoue un peu, ça devient aléatoire. Le secouer c'est à dire passer par tous types de fenêtres comme celle de l'explorateur ou de la fenêtre command de MSDOS ou fenêtres filles etc... Ca n'est pas très fiable!

  4. #4
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 401
    Par défaut
    en quoi? j'ai testé avec :
    - explorateur windows
    - 2 invites de commandes
    - visual studio 2010
    - mplayer
    - gestionnaire de tâches
    - windows live messenger et ses fenêtres de contacts
    - services manager
    etc ...

    j'utilise ça comme code :
    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
    #include <Windows.h>
    #include <iostream>
    using namespace std;
    HWND hWnd = 0;
    int main(int argc, char** argv)
    {
    	while( true )
    	{
    		HWND cur = GetForegroundWindow();
    		if( cur != hWnd )
    		{
    			hWnd = cur;
    			char name[100];
    			GetClassName(hWnd, name, 100);
    			cout << hWnd << " " << name << endl;
    		}
    		Sleep(1000);
    	}
    	return 0;
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Par défaut Fenêtre active (suite)
    Bon, je n’ai pas réussi à compiler ton programme avec BCC32 car j’ai systématiquement l’erreur suivante :
    Error: Unresolved external 'WinMain' referenced from C:\.....\ BCC55\LIB\C0W32.OBJ

    Mais, a priori, dans ma dll je fais la même chose que toi, sauf qu’au lieu d’aller chercher la classe de la fenêtre, dès que j’ai son hwnd je vais chercher son titre. Dans le cas où le HWND est NULL et dans celui où le HWND n’est pas égal à NULL mais que la longueur du titre est à 0, j’écris un titre par défaut (« sans titre »). J’écris le tout dans un fichier .txt. Dans ma dll, cette séquence se trouve dans une boucle de récupération des touches du clavier, sur chaque touche DOWN je vérifie par la séquence ci-après qu’on est toujours dans la même fenêtre.
    Comme je l’ai dit dans mon message précédent il y a des cas où je change de fenêtre, je tape sur des touches du clavier (même s’il n’y a pas de champ de saisie sur la nouvelle fenêtre active) et la séquence ci-après ne perçoit pas le changement de hwnd. Bizarre bizarre.
    activfen=GetForegroundWindow();
    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
    if(activfen!=lastactivfen)
    {
       lastactivfen=activfen;
       if(activfen!=NULL)
       {
          Longtitre=GetWindowText(activfen, Titrefen, Titrelong);
          if(Longtitre>0) {Titreaecrire=Titrefen;} else
          {Titreaecrire=Titredefaut; Longtitre=Defautlong;}
       } else
       {
          Titreaecrire=Titredefaut;
          Longtitre=Defautlong;
       }
       GetLocalTime(&temps);
       ecrire(WR_TITRE, Titreaecrire, Longtitre );
    }

  6. #6
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 401
    Par défaut
    ton code fonctionne bien chez moi, est ce que tu as réussi à reproduire un cas précis où ça ne fonctionne pas?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Par défaut Fenêtre active (suite)
    Bien, en cherchant une séquence qui pose problème, je pense avoir trouvé à quel moment le problème se produit, ce qui par contre pour l’instant ne me donne pas la solution pour le résoudre.
    En fait, j’ai fait la séquence ci-dessous, mais ça n’est pas la séquence qui est importante :

    J’ai tapé sur des touches dans la fenêtre de l’explorateur => titre : Fichiers
    Ensuite sur le net (page mail de yahoo) ::
    https://login.yahoo.com/config/login...ntl=fr&.src=ym
    => titre : Ouverture de session Yahoo! - Création de compte - Windows Internet Explorer
    Ensuite pages perso de free :
    http://www.free.fr/assistance/252-fr...erso-free.html
    => ça ne marche déjà plus, changement pas détecté
    Ensuite dans la page perso, je clique sur webmail, j’obtiens la page mail de free
    => changement toujours pas détecté
    Ensuite je lance Google : http://www.google.fr/
    => changement toujours pas détecté
    Ensuite je vais sur la page d’accueil d’orange :
    http://www.orange.fr/portail
    => changement détecté, titre : Portail Orange : Actu, Sport, Assistance Internet, Web Mail Orange - Windows Internet Explorer
    Sur cette page je clique sur la pub : Honda
    => changement détecté, titre : Honda | Nouvelle Jazz Hybrid - La 1ère citadine Hybride - Windows Internet Explorer
    Je reviens sur la page mail de Free :
    => changement pas détecté
    Je reviens sur le portail orange :
    => changement détecté, titre : Portail Orange : Actu, Sport, Assistance Internet, Web Mail Orange - Windows

    En conclusion, le problème est beaucoup moins aléatoire que ce qu’il me semblait. Il faut être devant mon écran pour comprendre parce que chez toi ça n’est pas certain que ça se présente pareil.
    En fait, Internet Explorer 8 a présenté les 3 sites : yahoo, Free et Google sous forme d’onglets (en haut de l’écran), alors que le site d’orange ainsi que celui de la pub Honda n’ont pas été mis sous forme d’onglets, ils sont restés en bas de l’écran. Le fonctionnement est donc le suivant : les sites qui restent en bas de l’écran (sans onglet) sont détectés lorsqu’on les active. Le 1er site du futur onglet est détecté quand on l’active (Yahoo dans mon cas) car lorsqu’il est encore seul il n’est pas encore considéré comme faisant partie de la future série d’onglets. Les autres sites qui se réfugient dans les onglets derrière le premier ne sont plus détectés !
    Je pensais que peut-être il faut que j’aille chercher du côté des fenêtre filles, mais en y regardant de plus près ça me paraît plus compliqué que ça (voir l’avant dernier test), en effet quand j’étais sur la pub Honda (qui n’est pas un onglet) et que je reviens sur une page de Free (qui fait partie des onglets) aucun changement n’est détecté, autrement dit GetForegroundWindow détecte toujours le hwnd de la page de pub alors que j’ai activé une des pages de l’onglet !!!
    Rajout: c'est bien le hwnd de la page de pub, ça n'est même pas un hwnd NULL car si c'était le cas avec mon programme j'écrirais le titre par défaut "sans titre")

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Par défaut Fenêtre active (suite et fin)
    Bonjour,
    Bon j’ai la réponse à mon problème :
    En fait lorsque que je dis que les fenêtres sont parfois présentées par IE8 en haut de l’écran sous forme d’onglets j’ai à moitié tort, car dans ce cas là la fenêtre IE8 est commune pour tous les onglets, chaque onglet n’est pas une fenêtre à part entière mais un contrôle dans la fenêtre commune ce qui explique pourquoi GetForegroundWindow() ne voit pas la différence. On remarquera cependant que lorsqu’on clique sur un des onglets le titre de la fenêtre commune change. Donc, pour savoir si l’utilisateur a changé de fenêtre, le test sur le changement de HWND ne suffit pas, dans le cas où le HWND n’a pas changé il faut aller voir en plus si par exemple le titre n’aurait pas, lui, changé en utilisant par exemple : Longtitre=GetWindowText(activfen, Titrefen, Titrelong);

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Par défaut
    Citation Envoyé par Athur Voir le message
    Comment retrouver sous windows et depuis une dll quelconque, le handle de la fenêtre sur laquelle l’utilisateur est en train de travailler ?
    J’ai essayé dans l’ordre les fonctions suivantes de l’API32 :
    1.- GetActiveWindow()
    2.- GetForegroundWindow ()
    3.- GetFocus()
    4.- GetClipboardOwner()

    Seules les deux premières marchent approximativement, c'est-à-dire que si l’utilisateur n’a sur son bureau qu’une seule fenêtre du net, les deux premières fonctions donnent le HWND de la fenêtre sur laquelle il travaille, si l’utilisateur va chercher une autre fenêtre sur le net, il doit au préalable tuer la fenêtre précédente pour que les 2 premières fonctions continuent à donner le HWND de la nouvelle fenêtre.
    Par contre, si l’utilisateur a plusieurs fenêtres sur son bureau (j’entends par là des fenêtres qui n’ont aucun lien entre elles), lorsqu’il passe d’une fenêtre à l’autre le HWND fourni par les deux premières fonction ne change pas ! Ou alors c’est que windows rattache la nouvelle fenêtre active au HWND précédent ce qui serait surprenant !
    Quelqu’un a-t-il une idée sur la manière de récupérer exhaustivement le HWND de la fenêtre sur laquelle l’utilisateur travaille ?
    Merci
    Comment avoir accés à ces méthodes ? quelles références faut il activer ?

  10. #10
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 401
    Par défaut
    Citation Envoyé par novice_prime Voir le message
    Comment avoir accés à ces méthodes ? quelles références faut il activer ?
    google?

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/12/2007, 00h10
  2. capture de la fenêtre active
    Par sjprm dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 28/06/2005, 14h15
  3. execution, threads et fenêtre active
    Par inertia dans le forum MFC
    Réponses: 2
    Dernier message: 26/05/2005, 11h05
  4. Fenêtre active
    Par Isa31 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 23/11/2004, 09h40
  5. Tester connexion Internet active sous Windows
    Par Altau dans le forum Développement
    Réponses: 3
    Dernier message: 12/08/2002, 12h43

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