Récupérer le contenu d'une partie d'une fenetre...

Récupérer le contenu d'une partie d'une fenetre... - C++ - Programmation

Marsh Posté le 05-06-2003 à 18:08:46    

Salut,
 
Dsl le sujet est pas clair :)
Voilà je fais un programme qui aurait besoin de récupérer un numéro qui apparait ds une fenetre d'un autre soft, dont je n'ai pas la source bien sûr...
y a-t-il un moyen de faire ça svp ?
 
Mici d'avance, même si je suis pessimiste...
 
PS : si c possible ds un autre langage que C/C++, hésitez pas à le dire qd mm, chui ouvert à tout :)

Reply

Marsh Posté le 05-06-2003 à 18:08:46   

Reply

Marsh Posté le 05-06-2003 à 18:09:36    

pilou51 a écrit :

Salut,
 
Dsl le sujet est pas clair :)
Voilà je fais un programme qui aurait besoin de récupérer un numéro qui apparait ds une fenetre d'un autre soft, dont je n'ai pas la source bien sûr...
y a-t-il un moyen de faire ça svp ?
 
Mici d'avance, même si je suis pessimiste...
 
PS : si c possible ds un autre langage que C/C++, hésitez pas à le dire qd mm, chui ouvert à tout :)


euhhhh... [:alph-one]
[edit]
Capture d'écran + ocr? [:ddr555]


Message édité par skeye le 05-06-2003 à 18:10:24
Reply

Marsh Posté le 05-06-2003 à 18:10:34    

me dis pas que spa possible  :cry:
 
Edit : erf oui ste bonne idée :) hum, qq'un d'autre ?  :whistle:


Message édité par pilou51 le 05-06-2003 à 18:11:24
Reply

Marsh Posté le 05-06-2003 à 18:17:37    

pilou51 a écrit :

Salut,
 
PS : si c possible ds un autre langage que C/C++, hésitez pas à le dire qd mm, chui ouvert à tout :)


 
du mal avec ton neurone ?
 
c posté ds la section c/c++, et tu veux un truc en autre chose ke tu c ?
 
j'ai ptet la solution en c++, apres, a toi de te mettre d'accord avec ton neurone.

Reply

Marsh Posté le 05-06-2003 à 18:40:04    

Utilises déjà un utilitaire comme spy++ (  visual c++ ) pour en savoir plus sur la fenêtre en question.
Après en fonction du résultat plusieurs techniques existent,
sous-classement, capture ...

Reply

Marsh Posté le 05-06-2003 à 19:08:47    

gnoof a écrit :

Utilises déjà un utilitaire comme spy++ (  visual c++ ) pour en savoir plus sur la fenêtre en question.
Après en fonction du résultat plusieurs techniques existent,
sous-classement, capture ...


 
FindWindow() aussi, apres tu recuperes le control en question et voila

Reply

Marsh Posté le 06-06-2003 à 08:14:07    

Merci pour ça v essayer...  :)  
 
Quant à mon neurone, j'ai posté dans C/C++ parceque c ce qui me semblait le plus probable et qu'il faut choisir une section, je pensais pas que les gens d'hfr étaient devenus bornés à ce point depuis la création des sous-sections, mais peut etre n'as-tu dit ça que pour etre fidèle à ton pseudo, que tu portes fort bien par ailleurs  :hello:

Reply

Marsh Posté le 06-06-2003 à 08:40:45    

et pis le problème, c que spy++ n'exporte pas ce qu'il trouve, donc pas moyen de faire le truc dynamiquement (l'handle est bien créé dynamiquement à chaque lancement d'une appli ?)...

Reply

Marsh Posté le 06-06-2003 à 09:13:22    

un peu de bricole
 
1) deja tu fais un findWindow pour recup l'HWND de la fenetre que tu veux
 
Ensuite fo retrouver le HWND du controle contenant les donnees souhaités. Perso je connais que la methode rustre :
 
 
dans une premiere phase, dans un programme de test :

Code :
  1. for (i=0;i<N;i++)
  2. {
  3. HWND m = GetDlgItem(hwndTaFenetre,i);
  4. //faire des test pour savoir si m est bien le controle souhaité, si oui, garder la valeur de i dans un coin
  5. }


 
apres tout ce que tu fais c :

Code :
  1. HWND h = FindWindow(..)
  2. HWND controle = GetDlgItem(h,iTrouvePlusHaut)
  3. GetDlgItemText(controle,...)


 
si qqun a plus fin je suis preneur
 
 
 
 
 
 
 

Reply

Marsh Posté le 06-06-2003 à 09:35:15    

merci bcp, mm si c brutal, ça me plaît bien, vu que les performances ne sont pas critiques pour mon appli (elle se contente de récupérer un numéro de téléphone dans un autre soft, puis va le chercher ds une base de donées...)
 
j'aurais tout de mm des questions, je suis pas spécialiste du tt de la prog windows... La fonction FindWindow est définie comme suit :  

Code :
  1. HWND FindWindow(
  2. LPCTSTR lpClassName,
  3. LPCTSTR lpWindowName );


à quoi correspondent les paramètres ? le premier je vois pas, le deuxième, c le nom de la fenetre tel qu'il apparait ?
 
D'autre part, une fois que j'ai récup mon handle sur la fenetre, comment puis-je afficher son contenu (en ce qui me concerne c une zone de texte) directement, afin de vérifier que c la bonne fenetre par exple ? Désolé, je sais que c la base, mais je connais pas du tt ça :(
 
Merci bcp :)
 
 

Reply

Marsh Posté le 06-06-2003 à 09:35:15   

Reply

Marsh Posté le 06-06-2003 à 09:55:24    

hourra j'ai bien le handle de ma fenetre :)
reste à trouver comment afficher le contenu des items ds la boucle for... je cherche aussi, mais si qq'un sait et me le dit, je lui en voudrai pas  :D

Reply

Marsh Posté le 06-06-2003 à 09:57:14    

la reponse figure dans mon post, c sympa de me lire :O

Reply

Marsh Posté le 06-06-2003 à 10:00:43    

euh désolé :(
tu veux dire GetDlgItemText ? ça renvoit un UINT et je vois pas bien comment afficher le résultat après :(

Reply

Marsh Posté le 06-06-2003 à 10:04:13    

Mais merdalafin, quand on sait pas comment on utilise une fonction on cherche un peu par soit meme, bordel de cul :O
 
 
http://msdn.microsoft.com/library/ [...] emtext.asp
 
La :O
 
On va pas te la tenir tout le tps hein ? :O

Reply

Marsh Posté le 06-06-2003 à 10:05:22    

pilou51 a écrit :

euh désolé :(
tu veux dire GetDlgItemText ? ça renvoit un UINT et je vois pas bien comment afficher le résultat après :(


Citation :


int GetDlgItemText( int nID, LPTSTR lpStr, int nMaxCount ) const;
 
int GetDlgItemText( int nID, CString& rString ) const;
 
Parameters
 
nID
 
Specifies the integer identifier of the control whose title is to be retrieved.
 
lpStr
 
Points to the buffer to receive the control’s title or text.
 
nMaxCount
 
Specifies the maximum length (in bytes) of the string to be copied to lpStr. If the string is longer than nMaxCount, it is truncated.
 
rString
 
A reference to a CString.
 
 
 

Reply

Marsh Posté le 06-06-2003 à 10:07:31    

mici, désolé j'étais sur cette page aussi, mais il est tôt et chui dans le pâté... forcément qd c surligné en gras, on voit mieux :)
Merci bcp, désolé d'avoir abusé de votre patience...

Reply

Marsh Posté le 06-06-2003 à 10:28:53    

Bon chui pas sûr qu'on accepte encore de me répondre, mais qui ne tente rien n'a rien... :) et l'espoir fait vivre...
 
J'ai le code suivant :  

Code :
  1. int main (void) {
  2. char * texte = (char *) malloc (sizeof (char) * 6);
  3. HWND fenetre = FindWindow ("ThunderRT6FormDC","Nom de mon prog" );
  4. if (fenetre == NULL) printf("Fenetre non trouvee\n" );
  5. for (int i=0;i<10;i++) {
  6.  HWND m = GetDlgItem (fenetre, i);
  7.  if (GetDlgItemText(m, i, texte, 5) == 0) printf("Pas de texte trouve pour l'item %d\n", i);
  8.  else printf("Texte recupere : %s pour le handle : %d\n", texte, i);
  9. }
  10. return 0;
  11. }


Il me trouve bien le handle sur la fenetre (il n'affiche "fenetre non trouvée" que lorsque je ferme l'autre prog), par contre jamais de texte avec GetDlgItemText, quel que soit i... C encore moi qui me plante, ou bien ça peut etre autre chose ?
 
Merci infiniment à celui qui répondra :)

Reply

Marsh Posté le 06-06-2003 à 10:31:28    

GetDlgItemText(m, i, texte, 5)
 
c la que ca debloque, ne donne  pas "m" mais "fenetre" (tu veux le controle numero i de "fenetre" ). ca fait que le GetDlgItem ne sert a rien en fait
ensuite de 0 a 10 c leger, mais bon ca tu verras bien :D


Message édité par chrisbk le 06-06-2003 à 10:31:58
Reply

Marsh Posté le 06-06-2003 à 10:32:05    

pourquoi tu vas de 0 à 10...? Tu es sûr d'avoir 10 items seulement dans ta fenêtre?


Message édité par skeye le 06-06-2003 à 10:36:18
Reply

Marsh Posté le 06-06-2003 à 10:33:12    

j'ai essayé avec 100 et ça n'affiche rien ensuite non plus. Là j'ai réduit uniquement pour la visibilité.

Reply

Marsh Posté le 06-06-2003 à 10:34:30    

il lit pas mes reponses [:sisicaivrai]

Reply

Marsh Posté le 06-06-2003 à 10:35:52    

chrisbk a écrit :

il lit pas mes reponses [:sisicaivrai]


C'est ma faute je l'ai cachée en le quotant pour rien...dsl!
Pour la peine je la requote ta réponse:

Citation :

GetDlgItemText(m, i, texte, 5)  
 
c la que ca debloque, ne donne  pas "m" mais "fenetre" (tu veux le controle numero i de "fenetre" ). ca fait que le GetDlgItem ne sert a rien en fait


Message édité par skeye le 06-06-2003 à 10:36:41
Reply

Marsh Posté le 06-06-2003 à 10:37:10    

arf si on me tend des pièges en +... :)
 
J'ai changé en fenetre, mais c pareil, "pas de texte trouvé"...  :cry:

Reply

Marsh Posté le 06-06-2003 à 10:38:27    

pilou51 a écrit :

arf si on me tend des pièges en +... :)
 
J'ai changé en fenetre, mais c pareil, "pas de texte trouvé"...  :cry:  


 
ben augmente le nombre hein, et vazy franco, paske l'id ca peut etre n'importe quoi (conseil :vire le message "pas trouve" ) et affiche le numero de i quand tu en trouve)

Reply

Marsh Posté le 06-06-2003 à 10:39:51    

pilou51 a écrit :

arf si on me tend des pièges en +... :)
 
J'ai changé en fenetre, mais c pareil, "pas de texte trouvé"...  :cry:  


Tu as re-augmenté i?
[edit]
Grillaid, encore...


Message édité par skeye le 06-06-2003 à 10:40:37
Reply

Marsh Posté le 06-06-2003 à 10:42:24    

j'en suis à 1 000 000 et toujours rien  :cry:  
J'ai essayé en récupérant l'ID d'un contrôle au hasard donné par spy++ (c en hexa) et il ne m'affiche toujours rien...

Reply

Marsh Posté le 06-06-2003 à 10:56:18    

bon ok je sais, les int vont pas jusquà un million, mais c t pour le principe :)
Sinon, aucune solution ? c pas normal qu'il m'affiche rien qd je lui donne un ID valide, puisque récupéré par Spy++ non ?
 
help me plz, et mici bcp à ceux qui ont essayé :)

Reply

Marsh Posté le 06-06-2003 à 12:58:00    

Evolution !!!
 
En faisant un GetLastError(), il me renvoit une erreur 1421 qui correspond à "Control ID not found."
Soit :

An application, as part of its user interface, has requested an operation on a control (BUTTON, LISTBOX, SCROLLBAR, and so on) that does not exist in the user interface.


Est-ce que les ID de contrôle sont vraiment des valeurs numériques ? J'avais vu un code source où le gars mettait des IDC_qqchose, mais j'arrive plus à le retrouver, et qd j'essaie ça me dit argument incorrect...
 
Help plz, mici d'avance :)

Reply

Marsh Posté le 06-06-2003 à 13:00:32    

windows est moderne de nos jours, t'as aucun droit sur un processus qui ne t'appartient pas, et ca doit inclure la récupération de certaines données.
 
bon, apres spy++ le fait, donc ca doit etre possible...

Reply

Marsh Posté le 06-06-2003 à 13:08:56    

Vi, peut etre est-ce un problème de droit...
Ben chui pas ds la merde moi.......

Reply

Marsh Posté le 06-06-2003 à 13:24:26    

vite fait :
un prog ki recupere le handle du TaskManager, puis recupere un handle sur la PropertySheet actuellement visible (Applications, Processes ou Performance), puis recupere le titre du 1er control fils de cette PropertySheet.
 

Code :
  1. // Get Task Manager
  2. HWND hWndTask = FindWindow(NULL, "Windows Task Manager" );
  3. if (!hWndTask)
  4. return 0;
  5. // Get Child window
  6. HWND hWndTruc = FindWindowEx(hWndTask, NULL, NULL, NULL);
  7. if (!hWndTruc)
  8. return 0;
  9. // Get First control
  10. HWND hWnd = FindWindowEx(hWndTruc, NULL, NULL, NULL);
  11. if (!hWnd)
  12. return 0;
  13. char str[256];
  14. GetWindowText(hWnd, str, 256);
  15. MessageBox(0, str, "truc", 0);


 
tout le truc, avec spy++ c'est de bien reperer l'arborescence du prog ou tu veux recuperer un controle, puis esperer que c'est constant (ke les noms changent pas trop koi), et de faire des FindWindow a la volée.

Reply

Marsh Posté le 06-06-2003 à 13:27:20    

merci bcp, v essayer d'utiliser ça :)

Reply

Marsh Posté le 06-06-2003 à 13:50:34    

Snif, il récup bien les handles sur les contrôles successifs, mais pas leur contenu (la MessageBox est vide) :(((
Je pense que c un problème de droit, car ça marche avec le Gestionnaire de tâches, alors y'a pas de raison :(

Reply

Marsh Posté le 06-06-2003 à 13:53:40    

ça marche pas non plus avec internet explorer ou toutes les fenetres que je peux tester... donc en fait c bizarre que ça marche avec le gestionnaire des tâches :)

Reply

Marsh Posté le 06-06-2003 à 15:21:16    

:bounce: personne n'a d'explication plz ? :)

Reply

Marsh Posté le 06-06-2003 à 15:22:38    

pilou51 a écrit :

:bounce: personne n'a d'explication plz ? :)


 
regarde deja quelle fonction retourne une erreur

Reply

Marsh Posté le 06-06-2003 à 15:25:21    

c le GetWindowText() qui lève ça...

Reply

Marsh Posté le 06-06-2003 à 15:30:14    

pilou51 a écrit :

c le GetWindowText() qui lève ça...


 
quel type controle tu veux recuperer ?
sur quelle fenetre ?
Essaye GetLastError si GetwindowText retourne 0

Reply

Marsh Posté le 06-06-2003 à 15:35:55    

Avec ce code là j'ai plus d'erreur ( le GetLastError me renvoie 0), mais le GetWindowText renvoie une chaine vide...

Code :
  1. #include "main.h"
  2. int main (void) {
  3.   // Get Task Manager
  4.   HWND hWndTask = FindWindow(NULL,"Alcatel PIMphony Basic" );
  5.   if (!hWndTask)
  6.      return 0;
  7.  
  8.   // Get Child window
  9.   HWND hWndTruc = FindWindowEx(hWndTask, NULL, NULL, NULL);
  10.   if (!hWndTruc)
  11.      printf("child non trouve\n" );
  12.  
  13.   HWND hWnd = FindWindowEx(hWndTruc, NULL, NULL, NULL);
  14. if (!hWnd)
  15.   printf("Premier controle non trouve\n" );
  16. char str[256];
  17. GetWindowText(hWnd, str, 256);
  18. printf("Erreur : %d\n", GetLastError());
  19. MessageBox(0, str, "truc", 0);
  20.   return 0;
  21. }


 
Comment je peux récupérer le handle des autres contrôles avec FindWindowEx stp ? Peut etre que le premier contrôle n'a pas de texte et c pour ça, mais je vois pas comment parcourir les autres...
 
Merci  :jap:
 
EDIT : j'ai viré le premier source en commentaires...


Message édité par pilou51 le 06-06-2003 à 15:36:50
Reply

Marsh Posté le 06-06-2003 à 15:38:06    

En fait, je veux récupérer un numéro de téléphone (donc du texte) sur une zone d'affichage (pas de saisie, je sais pas comment ça s'appelle exactement).

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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