Fenetre mère d'un RECT

Signaler
Messages postés
10
Date d'inscription
vendredi 29 décembre 2006
Statut
Membre
Dernière intervention
14 février 2010
-
Messages postés
10
Date d'inscription
vendredi 29 décembre 2006
Statut
Membre
Dernière intervention
14 février 2010
-
Bonjour,
voilà le problème que je rencontre.

Je tente de récupérer les informations que mon écran écrit via la fonction ExtTextOut.

Je redéfini donc la fonction ExtTextOut(...)
J'arrive bien à récupéré ce qui s'affiche mais mon problèmeest que j'aimerai pouvoir savoir d'ou vient ce que je récupère.

Concrètement, lorsque quelque chose s'affiche sur mon écran, j'aimerai savoir dans quelle fenetre (son handle) elle s'affiche.

J'ai d'abord penser à utiliser la fonction WindowFromDC() puisque le premier paramètre de ExtTextOut est un HDC.
Mais cette fonction me renvoie NULL tout le temps.

Du coup je me demandais (et c'est là ma vraie question :) )
Puis-je me servir du paramètre RECT* monrect ?

La fonction ExtTextOut prend un RECT* en paramètre qui est le RECT* dans lequel mon texte s'affiche.
J'aimerai réussir à trouver les coordonnées du point supérieur gauche de ce RECT* et retrouver ainsi facilement le handle de la fenetre.

J'ai cherché partout, j'ai vu comment avoir la largeur , longueur, la marge ect ... mais pas les coordonnées.
Je me sent un peu bloqué y a-t-il un moyen de me sauver :) ?

9 réponses

Messages postés
10
Date d'inscription
vendredi 29 décembre 2006
Statut
Membre
Dernière intervention
14 février 2010

Par soucis de clarté, je précise que ce qui m'interresse c'est de pouvoir retrouver la fenetre mère.

Quand je fait rect->right ect j'ai les coordonnées du point mais dans le référentiel de la fenètre mère donc ça ne m'apporte aucune précision supplémentaire.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
GetDCOrgEx
WindowFromPoint

Partant de ces 2 fonctions, devrait y avoir moyen d'avancer.

ciao...
BruNews, MVP VC++
Messages postés
10
Date d'inscription
vendredi 29 décembre 2006
Statut
Membre
Dernière intervention
14 février 2010

Haaa :)
Je test ça dans quelques minutes :)
Mais jviens d'aller voir le msdn sur ces fonctions ça à l'air de correspondre parfaitement :)

Je te tiens au courant mais en tout cas merci beaucoup ça devrait résoudre mon pb :)
Messages postés
10
Date d'inscription
vendredi 29 décembre 2006
Statut
Membre
Dernière intervention
14 février 2010

Hum ...
Les fonctions que tu m'a proposé ont l'air de fonctionner ... mais pas pour tout.

En fait quand je test de récupérer ce qui s'écrit dans notepad par exemple, ça marche bien.
Je récupère bien un point avec les coordonnées du HDC de notepad niquel.

Mais pour certaines autres applications, ça me renvoie comme coordonnée 0,0 .

Est-ce que ça signifie que pour cette application le HDC utilisé est l'écran tout entier directement ?
Par exemple, quand j'écris un nouveau message ici sur cppfrance, quand j'essaie de récupérer les coordonnées du HDC ... il me met 0,0

Ma cause est-elle perdue à ton avis :) ?
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
bouh, que répondre...

Quel moyen d'interception de ExtTextOut() as-tu choisi ?
Comment récupères-tu les hdc ?
etc, etc...
Faut avouer que je n'ai pas le courage d'écrire tout un prog de test, le niveau du réchauffement climatique (-1 à Paris) m'inciterait plutot à l'hibernation.

ciao...
BruNews, MVP VC++
Messages postés
10
Date d'inscription
vendredi 29 décembre 2006
Statut
Membre
Dernière intervention
14 février 2010

En fait je redéfini ExtTextOut dans une dll que j'injecte dans les processus que je veux récupérer (pour mes exemples notepad.exe et firefox.exe).

J'ai trouver sur le net une librairie qui permet facilement la redéfinition de fonction (detours)

Je sauvegarde la fonction de base ExtTextOut :

BOOL (WINAPI * VraiExtTextOut)(HDC hdc, int X, int Y, UINT uint, RECT* rect, LPCWSTR montext, UINT taille, INT* lpDx) =ExtTextOutW;


Je fait la redéfinition comme suit :

BOOL WINAPI Redefinition(HDC hdc, int X, int Y, UINT uint, RECT* rect, LPCWSTR montext, UINT taille, INT* lpDx)

{

//là je fait mon traitement donc sur le texte

// puis je voudrais récupérer le handle de la fenetre ou le texte a été écrit
// donc je fais :

LPPOINT lpPoint=new POINT();
if(GetDCOrgEx(hdc,lpPoint))
{
FILE * pFile;
pFile = fopen ("c:/test3.txt","w");
fseek(pFile,0,SEEK_END);
fprintf (pFile, "x: %d \n et y : %d \n",lpPoint->x,lpPoint->y);
fclose (pFile);
}

// et je rapelle la vraie fonction que j'ai préalablement sauvegardé.

return VraiExtTextOut(hdc, X, Y, uint, rect, montext, taille, lpDx);
}



Puis grâce à la libraire detours que j'ai télécharger sur le net, une méthode me permet de dire qu'à chaque appel de la vraie méthode ExtTextOut, il appel plutot ma redéfinition.



J'espère que j'ai été assez clair ?
Et donc je voudrais le handle de la fenetre.
Mais sur certaine fenetre, le GetDCOrgEx(hdc,lpPoint) me renvoie 0,0 comme coordonnées
et le WindowFromDC me renvoie le handle 0.


Du coup jme suis dit que peut-être le hdc pour ces fenetres là était bizarre et qu'il fallait que je me débrouille avec le RECT ... mais jvois pas quoi faire pour etre franc :)
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Mais si tu as injecté une dll dans un processus (assurément le bon choix) et que ce n'est en fin de compte que le hwnd qui t'intéresse, il ne devrait pas etre trop difficile d'avoir le hwnd DEPUIS la dll. Enfin le transmettre à ton prog par un simple PostMessage serait plus que aisé.

Demain je verrai la suite de tes travaux.

ciao...
BruNews, MVP VC++
Messages postés
10
Date d'inscription
vendredi 29 décembre 2006
Statut
Membre
Dernière intervention
14 février 2010

Ouai je vois ce que tu veux dire.
C'est vrai qu'à l'injection, ça appelle la méthode DllMain qui prend en paramètre un handle et du coup je pourrai récupérer comme ça le handle.

Le problème, c'est pour des applications genre msn.
A l'injection, le handle va me filer le handle de ma fenetre msn principale.
Mais quand je vais ouvrir une autre fenetre et écrire dedans, je serais pas capable d'avoir le handle de cette fenetre en particulier.

En gros mon problème se pose pour toutes les applications dont plusieurs fenetres peuvent s'ouvrir sous le même processus. (jsé pas si je suis très clair :) )

En fait c'est réellement au moment ou ma fonction affichage ExtTextOut est appelée , et à ce moment précis, j'aimerai connaitre la fenetre ou cette fonction est appelée.

Je cherche en ce moment si il n'existe pas une fonction capable de me donner le handle de la fenetre ou s'execute à l'instant donné ma dll ... mais ca me parait improbable :)


J'ai pensé eventuellement à cliquer sur le HDC à chaque appelle de ExtTextOut, puis de chercher le handle de la fenetre active.

Mais si j'ai peur que ça puisse entrainer des confusion si jamais plusieurs fenetre msn par exemple s'ouvre en meme temps.
Messages postés
10
Date d'inscription
vendredi 29 décembre 2006
Statut
Membre
Dernière intervention
14 février 2010

PS : au passage merci d'avoir deja passer un peu de temps à essayer de m'aider :)