(VC++/Win32) [resolu] récupérer le texte d'un tooltip grace à son hwnd

[resolu] récupérer le texte d'un tooltip grace à son hwnd (VC++/Win32) - C++ - Programmation

Marsh Posté le 19-11-2005 à 11:48:19    

Hello,  
 
comment récupérer le texte contenu dans un tooltip quand on a que le hwnd du tooltip ( le hwnd qui correspond a la petite fenetre du tooltip ) ?
J'ai essayé avec GetWindowText() mais ça ne marche pas, j'ai une chaine vide... pourtant Spy++ arrive bien a le récupérer  ( affiché dans la case "window title" de spy++ )
ll doit falloir récupérer un control particulier dans cette fenetre, mais je ne vois pas comment...
 
 
Merci.


Message édité par ChristianS_ le 23-11-2005 à 21:05:31
Reply

Marsh Posté le 19-11-2005 à 11:48:19   

Reply

Marsh Posté le 19-11-2005 à 13:41:05    

:hello:  
La récupération du texte d'une tooltip est réalisé par

SendMessage(tooltip_hwnd, TTM_GETTEXT, (WPARAM)0, (LPARAM) (LPTOOLINFO) lpti);

(avec lpti  pointeur vers une structure TOOLINFOVoir doc http://msdn.microsoft.com/library/ [...] ettext.asp  :)


Message édité par olivthill le 19-11-2005 à 13:41:32
Reply

Marsh Posté le 19-11-2005 à 16:21:09    

Merci de la réponse,
 
j'y arrive pas, ça plante... je ne doit pas passer les bons paramètres   :??:  
 

Code :
  1. TCHAR titre[300];
  2. strcpy(titre,"" );
  3. TOOLINFO info;
  4. ZeroMemory(&info,sizeof(TOOLINFO));
  5. info.cbSize=sizeof(TOOLINFO);
  6. info.uFlags=TTF_IDISHWND;
  7. info.hwnd=hwnd;
  8. info.uId=(UINT_PTR)hwnd;
  9. info.lpszText=titre;
  10. ::SendMessage(hwnd,TTM_GETTEXT,(WPARAM)0,(LPARAM)(LPTOOLINFO)(&info));
  11. CString title=info.lpszText;
  12. MessageBox(title);


 
où hwnd est le handle du tooltip ( récupéré grace à Spy++ )
Il faut dire aussi de ce tooltip est un tooltip qui affiche le titre des fenetres quand on met le curseur sur un bouton de la barre des taches...( appartient à windows donc. )
ça fait planter explorer.Exe lors du SendMessage.
 
Je ne maitrise pas trop le TTM_GETTEXT et TOOLINFO.

Reply

Marsh Posté le 19-11-2005 à 16:39:27    

Code :
  1. info.uId=(UINT_PTR)hwnd;


Tu es sûr de ça ?
 
De plus CString c'est en MFC alors c'est bien du Win32 ton histoire ?


Message édité par slash33 le 19-11-2005 à 16:41:48
Reply

Marsh Posté le 19-11-2005 à 22:36:26    

oui je pense, d'apres la doc....  je ne connais que le handle alors je lui spécifie que l'id est le handle du tooltip au lieu de son ID  ( info.uFlags=TTF_IDISHWND; )   :??:  
 
J'ai utilisé un CString pour afficher le resultat dans ma messagebox.
Je test dans un projet MFC, mais ça ne change rien au probleme de recupération du texte du tooltip qui peut etre codé en win32  ( ::SendMessage... )

Reply

Marsh Posté le 23-11-2005 à 21:04:33    

OK, ça fonctionne avec le message TTM_GETTEXT, mais il semblerait qu'il faille passer une zone memoire non protégée par mon thead, pour que le tooltip puisse ecrire les infos dedans.
J'ai adapté un code VB trouvé sur un forum...
C'est bien la premiere fois que j'utilise les VirtualAllocEx et autre OpenProcess... en tout cas ça marche...
 
 

Code :
  1. // hwnd = hwnd du tooltip
  2. HWND parent=GetParent(hwnd);
  3. CString title;                   
  4. char texte[300];
  5. SIZE_T tailleEcritLu=0;
  6. TOOLINFO info;
  7. memset(&info, 0, sizeof(TOOLINFO));
  8. info.cbSize=sizeof(TOOLINFO);
  9.  
  10. DWORD pid=0;
  11. DWORD id=GetWindowThreadProcessId(hwnd,&pid);
  12. HANDLE  hProcess = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, FALSE, pid);
  13. LPVOID  sharedINFO = VirtualAllocEx(hProcess,NULL,sizeof(TOOLINFO), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
  14. LPVOID  sharedTEXT = VirtualAllocEx(hProcess,NULL,sizeof(texte), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
  15. WriteProcessMemory(hProcess, sharedINFO, &info, sizeof(TOOLINFO), &tailleEcritLu);
  16. SendMessage(hwnd, TTM_GETCURRENTTOOL, 0,  (LPARAM)sharedINFO);
  17. ReadProcessMemory(hProcess,  sharedINFO, &info, sizeof(TOOLINFO), &tailleEcritLu);
  18. info.lpszText=(LPSTR)sharedTEXT;
  19. WriteProcessMemory(hProcess, sharedINFO, &info, sizeof(TOOLINFO), &tailleEcritLu);
  20. SendMessage(hwnd, TTM_GETTEXT, 0,  (LPARAM)sharedINFO);
  21. ReadProcessMemory(hProcess,  sharedINFO, &info, sizeof(TOOLINFO), &tailleEcritLu);
  22. ReadProcessMemory(hProcess,  info.lpszText, texte, sizeof(texte), &tailleEcritLu);
  23. title=texte;
  24. VirtualFreeEx(hProcess,  sharedTEXT, sizeof(texte), MEM_RELEASE);
  25. VirtualFreeEx(hProcess,  sharedINFO, sizeof(TOOLINFO), MEM_RELEASE);
  26. CloseHandle(hProcess);
  27. MessageBox(NULL,title,"titre",0);


Message édité par ChristianS_ le 23-11-2005 à 21:06:09
Reply

Marsh Posté le 09-12-2005 à 18:49:17    

Voilà, c'était pour faire ça mon histoire de tooltip :
 
http://chsalmon.club.fr
 
 

Reply

Marsh Posté le 12-12-2005 à 11:00:06    

Je viens de tester, c'est excellent comme soft!

Reply

Marsh Posté le 12-12-2005 à 11:17:14    

jpense c'est logique, TTM_GETTEXT ecrit dans l'espace mémoire du process detenant le tooltip. Vu que toi t'es hors de son process, faut gruger.

Reply

Marsh Posté le 12-12-2005 à 11:27:00    

ben ouais


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 12-12-2005 à 11:27:00   

Reply

Marsh Posté le 12-12-2005 à 11:28:06    

par contre tu es cordialement invité ici :
 
http://forum.hardware.fr/hardwaref [...] m#t1264317
 
 
[:el g] tu nous fait un court sur les images dans un tooltip ?

Reply

Marsh Posté le 12-12-2005 à 11:30:50    

bah, ça doit pas etre bien dur ! un tooltip possède un hWnd, donc un HDC. à partir de là, tu fais ce que tu veux avec :spamafote:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 12-12-2005 à 11:32:05    

bin fo le subclasser quoi [:petrus75] j'imagine qu'ya des message pour la taille et tout

Reply

Marsh Posté le 12-12-2005 à 13:24:04    

ouais , j'suis pas un pro de C++ non plus.
vas s'y, montre nous ton subclass du tooltip et ton trafic de HDC !
aller, j'vous met bientot la version 1.1...
 
 :hello:

Reply

Marsh Posté le 15-12-2005 à 12:48:35    

Voilà, y'a la 1.1 pour ceux que ça interesse...
 
http://chsalmon.club.fr

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed