GetForegroundWindow() pas fiable ?!

ArthurAuguste Messages postés 107 Date d'inscription lundi 7 février 2011 Statut Membre Dernière intervention 17 février 2018 - 9 mars 2011 à 08:00
ArthurAuguste Messages postés 107 Date d'inscription lundi 7 février 2011 Statut Membre Dernière intervention 17 février 2018 - 11 mars 2011 à 15:12
Bonjour,
Y a-t-il une autre méthode que : GetForegroundWindow() ou GetActiveWindow() pour connaître depuis une DLL la fenêtre qui est actuellement active sous Windows car je constate que ces deux fonctions ne donnent pas toujours le résultat prévu. En effet, si vous êtes par exemple sous Windows XP avec IE8 comme navigateur, tant que les fenêtres des sites consultés sont stockés en bas de l'écran dans la barre des tâches les deux fonctions donnent le résultat attendu dès que vous activez une de ces fenêtres. Par contre, si les fenêtres consultées n'apparaissent plus dans la barre des tâches parce que IE8 les a prises à son compte et les fait apparaître sous forme d'onglets en haut de l'écran, alors les deux fonctions ne détectent plus les changements quand vous activez une nouvelle fenêtre en passant d'un onglet à l'autre. Il y a même pire les deux fonctions ne détectent pas non plus le changement quand votre précédente fenêtre active était une de celles stockées en bas de l'écran et que vous activez maintenant une fenêtre quelconque de l'onglet !
Quelqu'un connaîtrait-il une méthode infaillible pour déterminer la fenêtre active quel que soit l'endroit où elle est stockée ?
Merci

4 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
9 mars 2011 à 08:52
salut,

C'est plutôt ton raisonnement qui ne fonctionne pas correctement. Les fenêtres retournées par ces fonctions sont les bonnes. Un onglet n'est pas une fenêtre principale mais un contrôle dans la fenêtre principale. Tu peux faire des recherches sur les contrôles enfants avec GetWindow(), GetWindowText(), ...

@++
0
ArthurAuguste Messages postés 107 Date d'inscription lundi 7 février 2011 Statut Membre Dernière intervention 17 février 2018
9 mars 2011 à 15:00
Ok merci, je pensais qu'une fois qu'on avait cliqué sur un onglet la fenêtre changeait puisque le titre n'était plus le même, j'avais d'ailleurs hésité à contrôler aussi le changement de titre, j'aurais dû le faire avant de poser la question. En fait, pour savoir s'il y a un changement finalement je teste maintenant d'abord le changement de fenêtre avec GetForegroundWindow(), s'il n'y a pas de changement de fenêtre je regarde si par hasard il n'y aurait pas quand même un changement de longueur de titre avec Longtitre=GetWindowText(activfen, Titrefen, Titrelong); Je sais bien que normalement j'aurais dû comparer le titre courant avec le précédent mais la probabilité pour deux longueurs de titres différents soient identiques est quand même assez faible et ça m'économise un buffer pour l'ancien titre.
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
11 mars 2011 à 10:14
re,

Assez faible mais loin de nul. Il y aura forcement des cas où...

Il y a également un problème si le même onglet change de page. Ton programme croira que mais en fait non.

Tu peux aussi memoriser le handle actif dans la fenêtre et verifier qu'il n'a pas changé. Je pense qu'un GetWindowEx() avec le handle de la fenêtre parent et GW_HWNDFIRST devrait retourné le handle actuellement actif mais a verifier. Les onglets pourraient aussi se retrouver childs d'un autre contrôle et cela pourrait être différent suivant les navigateurs et les mêmes navigateurs mais de version différentes.

@++
0
ArthurAuguste Messages postés 107 Date d'inscription lundi 7 février 2011 Statut Membre Dernière intervention 17 février 2018
11 mars 2011 à 15:12
Salut,
J'avais déjà essayé le GetWindowEx() avec GW_HWNDFIRST et même d'autres GW_ mais ça ne marchait pas. La solution avec GetForegroundWindow() + Longtitre=GetWindowText(activfen, Titrefen, Titrelong); et vérification de la longueur du titre pour l'instant marche à 100%. La probabilité pour que deux longueurs de titre différents soient identiques est faible car pour que ça ne marche pas il faut deux conditions supplémentaires: 1.- que ce soit deux titres de fenêtres présentées en onglets, 2.- qu'ils soient consultés consécutivement. Disons que si le cas se produisait ça ne serait pas très grave et je pourrais si ça devenait gênant comparer les titres eux-mêmes, bien qu'on peut là ausssi imaginer avec une probabilité encore plus faible que deux titres consultés consécutivement sur des onglets soient strictement identiques bien que les fenêtres soient différentes.
Merci
0
Rejoignez-nous