Lire Texte d'une fenetre windows

Résolu
nomlingote Messages postés 6 Date d'inscription jeudi 29 septembre 2005 Statut Membre Dernière intervention 3 octobre 2005 - 29 sept. 2005 à 14:45
nomlingote Messages postés 6 Date d'inscription jeudi 29 septembre 2005 Statut Membre Dernière intervention 3 octobre 2005 - 30 sept. 2005 à 12:22
Bonjour à tous,
J'utilise Dev C++ comme environnement.
Je souhaite faire une application console qui puisse lire le contenu des TEXTBOX , RICHEDIT... d'une fenetre windows.
Le but est de recuperer tout ce qu'il y a comme text dans un textbox ou autres controles de l'application Windows par exemple et le faire analyser par l'application console.
Pour être precis, si l'application windows affiche un texte dans une zone quelconque de la fenetre, le programme (console) devrait pouvoir aller lire ce texte affiché par l'application windows.

Merci de votre aide.

7 réponses

julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
30 sept. 2005 à 10:11
Sinon, une autre idée qui me vient comme ca.

Pour récupérer l'identifiant du composant que tu veux commander, utilises spy++.



Tu vas peut etre te demander pourquoi je parle toujours de l'ID plutot que du handle.

C'est parcque l'ID ne varie pas. A chaque fois que tu lances une
application son handle ainsi que celui de ses composants est réaffecté,
alors que les ID restent identiques.



Avec spy++, tu vas dans le menu Spy/Find Window.

La, avec l'outil de recherche, tu sélectionnes le composant que tu souhaites commander.

En cliquant sur le bouton OK (case Properties cocher), tu vas voir toutes les proprietes du composant, dont son identifiant.

C'est encore plus simple que mon premier exemple.

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
3
nomlingote Messages postés 6 Date d'inscription jeudi 29 septembre 2005 Statut Membre Dernière intervention 3 octobre 2005
29 sept. 2005 à 14:46
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
29 sept. 2005 à 17:47
Recupere le handle de la fenetre dans laquelle tu veux récpérer le texte.

FindWindow

Puis, récupère le handle des composants de la fenetre. (A coup de EnumChildWindow)

Sinon, tu peux aussi récupérer les ID des composants que tu veux en
faisant un prog de test qui écrit sur chaque composant de ta fenetre la
valeur de l'ID:

<hr size="2" width="100%">UINT i;

char buffer[30];



for (i = 0; i < MAXID; i++)

SendDlgItemMessage(hParent, i, WM_SETTEXT, 0, itoa(i, buffer, 10));

<hr size="2" width="100%">

Selon la méthode effectuée, tu as soit le handle du composant, soit
l'identifiant du composant, et avec ça, tu as le handle de la fenetre.

1.-Handle du composant:

Utilise la fonction SendMessage avec le bon message pour récupérer le texte du composant

Ex: Récupérer le texte afficher sur un bouton dont le handle est contenu dans hButton:

char buffer[256];

SendMessage(hButton, WM_GETTEXT, 255, buffer);



2.-ID du composant:

Utilise la fonction SendDlgItemMessage pour envoyer un message au composant.

Ex: Récupérer le texte du bouton d'identifiant IDButton dans la fenetre de handle hParent

char buffer[256];

SendDlgItemMessage(hParent, IDButton, WM_GETTEXT, 255, buffer);


Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
nomlingote Messages postés 6 Date d'inscription jeudi 29 septembre 2005 Statut Membre Dernière intervention 3 octobre 2005
30 sept. 2005 à 06:58
salut julienbj,

J'ai essayé votre sugesstion sans succes; j'ai eu un probleme avec la conversion de type dans la fonction SendDlgItemMessage() Exemple 2.
Je serai plus à l'aise avec les handle des composants de la fenetre.
Si vous voulez bien me donner un exemple détaillé avec la fonction EnumChildWindow ().

Merci de votre aide.
0

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

Posez votre question
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
30 sept. 2005 à 10:00
Je veux bien te faire un exemple, mais la solution 2 me parait de loin la plus facile à mettre en place.

Pourquoi je dis ca?

Parcque EnumChildWindow va t'énumérer tous les composants d'une
fenetre. Alors comment savoir lequel tu veux récupérer? J'ai quelques
idées, mais elles sont assez tordues pour l'instant.



Pour la solution 2, je comprends pas ce que tu appelles un probleme de type.

Je vais essayer d'etre un peu plus clair sur ce qu'il faut que tu fasses.

Il faut que tu crées un second programme (qui ne sera lancé qu'une fois par toi).

Dans ce programme, tu demandes à chaque composant d'afficher son identifiant.

Pour cela, tu parcours tous les identifiants possibles et tu envoies le
message SETTEXT par exemple. Avec comme chaine à afficher, la chaine
contenant la valeur de l'identifiant.

La, tu regardes le composant que tu veux commander à partir de ta vrai application, et tu notes son identifiant en #define.

Apres, ben tu n'as plus qu'à le commander.



Mais explicite un peu l'erreur de type STP.

Je pense tu n'as pas du mettre les bonnes choses dans ton SendDlgItemMessage.

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
30 sept. 2005 à 10:02
J'ai oublié:

Pour passer de l'identifiant au handle, tu peux utiliser la fonction: GetDlgItem

Pour passer du handle à l'identifiant, utilise la fonction GetWindowLong avec le parametre GWL_ID.

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
nomlingote Messages postés 6 Date d'inscription jeudi 29 septembre 2005 Statut Membre Dernière intervention 3 octobre 2005
30 sept. 2005 à 12:22
Salut,
J'avais intégré directement tes suggestions à mon prog, mais en faisant un autre programme pour ecrire sur les composants de la fenetre j'ai pu corriger mon erreur. (j'avais déclaré buffer[] comme int.)
Parfait je retiens le ID comme valeur de reference Ca rend le programme moins lourd en effet. C'est fou ce qu'on peut faire avec du C.

Je vais quand meme regarder les fonctions GetDlgItem et GetWindowLong. On ne sait jamais ...

Merci pour l'aide.
0
Rejoignez-nous