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

Windows Discussion :

recuperer le "z-order"


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 28
    Points : 16
    Points
    16
    Par défaut recuperer le "z-order"
    mes salutations distinguées,

    je cherche une methode pour lister toutes les fenetres "visibles" (definition juste en bas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    WINDOWPLACEMENT wndPl;
    wndPl.length = sizeof(WINDOWPLACEMENT);
    BOOL val = GetWindowPlacement (hwndZ, &wndPl);
    if (IsWindowVisible(hwndZ) && (wndPl.showCmd==SW_SHOWNORMAL||wndPl.showCmd==SW_SHOWMAXIMIZED))
        hwndDuneFenetre"Visible"
    Et a en extraire leur lien sur le z-order.

    Reformulons : j'ai une liste de HWND récupérée avec enumWindow, et à partir de cette liste, j'aimerai connaitre quelle fenetre recouvre laquelle, obtenir le z-order quoi.

    J'en arrive à GetNextWindow, qui est equivalente à GetWindow, qui est deconseillé d'utiliser dans une boucle (je suppose parce que l'ordre peut changer en cours). Ils conseillent donc d'utiliser enumWindow que j'ai deja appelé

    Ma question est : la fonction enumWindow enumere-t-elle les handle en respectant le z-order ?

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Je pense qu'ils déconseillent d'utiliser GetNextWindow() pour la condition d'arrêt dans ta boucle, seulement.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Imagine que je parcours les hwnd avec getNextWindow et que l'avant derniere passe premiere, donc le next de l'avant derniere devient le deuxieme, et c'est reparti ! Il y a donc risque de boucle infini. Peut probable quand meme. Pour la condition de sorti, tu ne peux qu'utiliser le retour de getNextWindow.

    Il ne faut pas les fenetres changent de profondeur pendant qu'on parcours les handles. C'est ce que j'ai deduis. Alors que la fonction enumWindow est atomique (on va dire ): puisque c'est un unique appel systeme, il peut caler l'appel des CALLBACK entre deux rafraichissements.

    Si je me trompe, envoyé les torpilles


    Sinon, les premiers essaient de comparaison entre getNextWindow et enumWindow me font penser que ces 2 methodes renvoient les handles triés par z-order (au pifometre, cad comparaison à l'oeil sur la console). J'attends vos expertises

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Franchement, je ne suis pas certain qu'EnumWindows() soit atomique. Mais dans tous les cas, pourquoi ne pas te faire une liste avec EnumWindows(), et établir la "parenté" avec GetNextWindow() pour chaque élément?

    Ainsi, tu n'utiliseras pas GetNextWindow() pour ta condition de sortie...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Je vais test ta solution. OK, oublie le terme "atomique", j'ai toujours tendance à utiliser les mots hors du sens initial. Je voulais simplement dire que le contexte (à savoir le z-order) ne pouvait pas changer pendant l'appel des CALLBACK.

    target locked ?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Franchement, je doute que ça ne puisse pas changer. Sous Win16, j'aurais dit OK sans aucun problème (sauf si TU changes les choses, bien entendu), mais sous Win32, je ne vois pas ce qui empêche.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Voila, le resultat et merci :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    bool Capture::getZOrder (std::vector<HWND> * res) {
    
    	std::map<HWND,std::pair<HWND,HWND> > wndNnext;
    	std::map<HWND,bool> vu;
    
    	if (!res) {
    		log->log(Logger::IMPORTANT, "Capture::getZOrder", "test0 echoue");
    		return false;
    	}
    
    	// Recupere les handles et leur GW_HWNDNEXT/GW_HWNDPREV
    	if (!EnumWindows (getWnd, (LPARAM)& wndNnext)) {
    		log->log(Logger::IMPORTANT, "Capture::getZOrder", "test1 echoue");
    		return false;
    	}
    
    	HWND h = NULL;
    
    	// Recupere le premier (zorder) handle
    	int f=0,e=0;
    	for (std::map<HWND,std::pair<HWND,HWND> >::iterator it = wndNnext.begin();  it != wndNnext.end();  it ++) {
    		vu[it->first] = false;
    		if (it->second.second == NULL) {
    			f++;
    			h = it->first;
    		}
    		if (it->second.first == NULL)
    			e++;
    	}
    
    	if (!h) {
    		log->log(Logger::IMPORTANT, "Capture::getZOrder", "test2 echoue");
    		return false;
    	}
    
    	if (f!=1) {
    		log->log(Logger::IMPORTANT, "Capture::getZOrder", "test3 echoue");
    		return false;
    	}
    	if (e!=1) {
    		log->log(Logger::IMPORTANT, "Capture::getZOrder", "test4 echoue");
    		return false;
    	}
    
    	do {
    		if (vu[h] == true) {
    			log->log(Logger::IMPORTANT, "Capture::getZOrder", "test5 echoue");
    			return false;
    		}
    		WINDOWPLACEMENT wndPl;
    		wndPl.length = sizeof(WINDOWPLACEMENT);
    		BOOL val = GetWindowPlacement (h, &wndPl);
    		if (val == 0) {
    			log->log(Logger::IMPORTANT, "Capture::getZOrder", "test6 echoue");
    			return false;
    		}
    		if (IsWindowVisible(h) && (wndPl.showCmd==SW_SHOWNORMAL||wndPl.showCmd==SW_SHOWMAXIMIZED))
    			res->push_back(h);
    		vu[h] = true;
    		h = wndNnext[h].first;
    	} while (h);
    
    
    	for (std::map<HWND,bool>::iterator it = vu.begin(); it!=vu.end(); it++)
    		if (it->second==false) {
    			log->log(Logger::IMPORTANT, "Capture::getZOrder", "test7 echoue");
    			return false;
    		}
    
    	return true;
    }
    
    
    BOOL CALLBACK Capture::getWnd (HWND hwnd, LPARAM lParam) {
    	std::map<HWND,std::pair<HWND,HWND> > * list = (std::map<HWND,std::pair<HWND,HWND> > *)lParam;
    
    	HWND hNext = GetNextWindow(hwnd, GW_HWNDNEXT);
    	HWND hPrev = GetNextWindow(hwnd, GW_HWNDPREV);
    	(*list)[hwnd].first  = hNext;
    	(*list)[hwnd].second = hPrev;
    	return 1;
    }

Discussions similaires

  1. Quote et double quote
    Par aktos dans le forum Langage
    Réponses: 8
    Dernier message: 05/01/2007, 19h55

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