Fenetre mère d'un RECT

cs_ghostichou Messages postés 10 Date d'inscription vendredi 29 décembre 2006 Statut Membre Dernière intervention 14 février 2010 - 13 févr. 2010 à 00:49
cs_ghostichou Messages postés 10 Date d'inscription vendredi 29 décembre 2006 Statut Membre Dernière intervention 14 février 2010 - 14 févr. 2010 à 00:25
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

cs_ghostichou Messages postés 10 Date d'inscription vendredi 29 décembre 2006 Statut Membre Dernière intervention 14 février 2010
13 févr. 2010 à 03:03
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 févr. 2010 à 10:42
GetDCOrgEx
WindowFromPoint

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

ciao...
BruNews, MVP VC++
0
cs_ghostichou Messages postés 10 Date d'inscription vendredi 29 décembre 2006 Statut Membre Dernière intervention 14 février 2010
13 févr. 2010 à 13:09
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 :)
0
cs_ghostichou Messages postés 10 Date d'inscription vendredi 29 décembre 2006 Statut Membre Dernière intervention 14 février 2010
13 févr. 2010 à 14:21
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 :) ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 févr. 2010 à 14:40
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++
0
cs_ghostichou Messages postés 10 Date d'inscription vendredi 29 décembre 2006 Statut Membre Dernière intervention 14 février 2010
13 févr. 2010 à 14:58
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 :)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 févr. 2010 à 15:17
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++
0
cs_ghostichou Messages postés 10 Date d'inscription vendredi 29 décembre 2006 Statut Membre Dernière intervention 14 février 2010
14 févr. 2010 à 00:25
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.
0
cs_ghostichou Messages postés 10 Date d'inscription vendredi 29 décembre 2006 Statut Membre Dernière intervention 14 février 2010
14 févr. 2010 à 00:25
PS : au passage merci d'avoir deja passer un peu de temps à essayer de m'aider :)
0
Rejoignez-nous