Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

GetForegroundWindow() pas fiable ?!

2 réponses
Avatar
Roger
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

2 réponses

Avatar
Christian ASTOR
Roger a écrit :
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.




As-tu testé avec GetGUIThreadInfo() ?
Un truc comme ça =>

HWND GetFocusedWindow()
{
GUITHREADINFO gti;
ZeroMemory(&gti, sizeof(gti));
HWND hWndForeground = GetForegroundWindow();
if (hWndForeground != NULL)
{
gti.cbSize = sizeof(gti);
GetGUIThreadInfo(GetWindowThreadProcessId(hWndForeground,
NULL), &gti);
}
return gti.hwndFocus;
}
Avatar
Roger
As-tu testé avec GetGUIThreadInfo() ?
Un truc comme ça =>

HWND GetFocusedWindow()
{
GUITHREADINFO gti;
ZeroMemory(&gti, sizeof(gti));
HWND hWndForeground = GetForegroundWindow();
if (hWndForeground != NULL)
{
gti.cbSize = sizeof(gti);
GetGUIThreadInfo(GetWindowThreadProcessId(hWndForeground, NULL),
&gti);
}
return gti.hwndFocus;
}



Merci pour la réponse, mais entre-temps j'ai eu une explication au non
fonctionnement de GetForegroundWindow():
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);



C'est ce que j'ai fait et ça marche, a priori, dans tous les cas.

J'ai jeté un oeil à ta proposition, mais on ne doit pas avoir la même
version de l'API32, GUITHREADINFO et GetGUIThreadInfo ne sont pas
répertoriées dans mon API, de plus je veux identifier la fenêtre même si
elle n'a pas de champ avec le focus.

Merci,

Cordialement,