begin process at 2012 02 04 09:04:39
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > LIRE LE CONTENU DE CONTRÔLES TEXTBOX, RICHEDIT,... D'AUTRES APPLIS WINDOWS

LIRE LE CONTENU DE CONTRÔLES TEXTBOX, RICHEDIT,... D'AUTRES APPLIS WINDOWS


 Information sur la source

Note :
10 / 10 - par 4 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Source .NET ( DotNet ) Classé sous :sendmessage, findwindowex, getcontroltext, applications Niveau :Débutant Date de création :07/12/2003 Date de mise à jour :08/12/2003 00:09:45 Vu / téléchargé :17 359 / 649

Auteur : vieuxLion

Ecrire un message privé
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Il est parfois important de communiquer entre Managé (C# et CLR) et non Managé (C++ et Win32).
Si vous devez récupérer automatiquement des données qui sont renseignées dans une application Windows extérieure, voici une technique à base de PInvoke

Le StringBuilder est très important !
essayez de décommenter la ligne de #define
ce qui provoque le remplacement des "StringBuilder" par des "string" dans la déclaration et l'appel de GetControlText
Que se passe t-il ?
Nous initialisons une zone 'string' avec des 0. Dans l'exécution de la fonction GetControlText, il y modification de la valeur du string... et la runtime alloue un nouvel emplacement pour ce string. Notre ancienne variable pointe toujours sur la zone initialisée avec nos zeros. Il est donc extrèmement important d'utiliser le StringBuilder qui lui est modifiable (méthode Append)

Source

  • //Faire un projet "Console" et copier ceci
  • //#define STRING // ligne à décommenter pour STRING, à commenter pour STRINGBUILDER
  • using System;
  • using System.Runtime.InteropServices;
  • using System.Text;//pour le StringBuilder
  • class Test
  • {
  • private const int WM_GETTEXTLENGTH = 14;//pour utilisation de SendMessage
  • private const int WM_GETTEXT = 13;//pour utilisation de SendMessage
  • [DllImport("user32.dll", EntryPoint="FindWindowEx")]
  • public static extern int FindWindowEx (
  • int hwndParent, int hwndEnfant, int lpClasse, string lpTitre);
  • [DllImport("user32.dll", EntryPoint="SendMessage")]
  • public static extern int SendMessage (
  • int hwnd, uint wMsg, int wParam, int lParam);
  • [DllImport("user32.dll", EntryPoint="SendMessage")]
  • public static extern int GetControlText ( //renommée pour spécialisation du dernier param
  • #if STRING
  • int hwnd, uint wMsg, int wParam, string lParam);//lParam : récupération du texte
  • #else
  • int hwnd, uint wMsg, int wParam, StringBuilder lParam);//lParam : récupération du texte
  • #endif
  • static void Main(string[] args)
  • {
  • Console.WriteLine("titre de la fenetre a scanner");
  • string titre = Console.ReadLine();
  • int hwnd = FindWindowEx(0, 0, 0, titre);
  • if (hwnd==0) {Console.WriteLine("Erreur, fenêtre non trouvée"); return ;}
  • Console.WriteLine("hwnd Parent = {0}",hwnd);
  • Console.WriteLine("Liste des contrôles enfants:");
  • int hwndEnfant=FindWindowEx(hwnd, 0, 0, null);
  • while (hwndEnfant!=0)
  • {
  • int lgTexte = SendMessage(hwndEnfant, WM_GETTEXTLENGTH, 0, 0) + 1;
  • #if STRING
  • string sbTitre = new string('0',lgTexte);
  • #else
  • StringBuilder sbTitre = new StringBuilder(lgTexte);
  • #endif
  • GetControlText(hwndEnfant, WM_GETTEXT, lgTexte, sbTitre);
  • Console.WriteLine("hwnd={0} => {1}", hwndEnfant, sbTitre);
  • hwndEnfant=FindWindowEx(hwnd, hwndEnfant, 0, null);
  • }
  • Console.WriteLine("Tapez sur une touche...");
  • Console.Read();
  • }
  • }
//Faire un projet "Console" et copier ceci

//#define STRING // ligne à décommenter pour STRING, à commenter pour STRINGBUILDER

using System;
using System.Runtime.InteropServices;
using System.Text;//pour le StringBuilder

class Test
{
	private const int WM_GETTEXTLENGTH = 14;//pour utilisation de SendMessage
	private const int WM_GETTEXT = 13;//pour utilisation de SendMessage
	
	[DllImport("user32.dll", EntryPoint="FindWindowEx")]
	public static extern int FindWindowEx ( 
		int hwndParent,	int hwndEnfant,	int lpClasse, string lpTitre);
	[DllImport("user32.dll", EntryPoint="SendMessage")]
	public static extern int SendMessage (
		int hwnd, uint wMsg, int wParam, int lParam);
	[DllImport("user32.dll", EntryPoint="SendMessage")]
	public static extern int GetControlText ( //renommée pour spécialisation du dernier param
#if STRING
		int hwnd, uint wMsg, int wParam, string lParam);//lParam : récupération du texte
#else
		int hwnd, uint wMsg, int wParam, StringBuilder lParam);//lParam : récupération du texte
#endif

	static void Main(string[] args)
	{
		Console.WriteLine("titre de la fenetre a scanner");
		string titre = Console.ReadLine();
		int hwnd = FindWindowEx(0, 0, 0, titre);
		if (hwnd==0) {Console.WriteLine("Erreur, fenêtre non trouvée"); return ;}
		Console.WriteLine("hwnd Parent = {0}",hwnd);
		Console.WriteLine("Liste des contrôles enfants:");

		int hwndEnfant=FindWindowEx(hwnd, 0, 0, null);
		while (hwndEnfant!=0)
		{
			int lgTexte = SendMessage(hwndEnfant, WM_GETTEXTLENGTH, 0, 0) + 1; 
#if STRING
			string sbTitre = new string('0',lgTexte);
#else
			StringBuilder sbTitre = new StringBuilder(lgTexte);
#endif
			GetControlText(hwndEnfant, WM_GETTEXT, lgTexte, sbTitre);
			Console.WriteLine("hwnd={0} => {1}", hwndEnfant, sbTitre);
			hwndEnfant=FindWindowEx(hwnd, hwndEnfant, 0, null);
		}
		Console.WriteLine("Tapez sur une touche...");
		Console.Read();
	}
}

 Conclusion

code fourni avec une boite de dialogue (MFC) de test comportant en particulier un richedit

modification : la première version codait en dur une taille max de 255 caractères pour le texte récupéré. Cette version s'affranchit de cette limite
Elle appelle deux fois SendMessage :
une pour déterminer la longueur
l'autre pour charger le texte


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) JEU DE TAQUIN (POUR PDA)
Source avec Zip Source avec une capture Source .NET (Dotnet) ECRIRE EN COULEUR SUR LA CONSOLE
Source avec Zip Source avec une capture Source .NET (Dotnet) UTILISER LES 3 TECHNIQUES DE SÉRIALISATION DOTNET ET "VOIR" ...
Source avec Zip Source .NET (Dotnet) TRAVAIL SUR LES BASES DE DONNÉES, LES DATASETS ET LES FICHIE...
Source .NET (Dotnet) RENDRE STATEFULL UN WEB SERVICE

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) GETSYSTEMTIME ET SETSYSTEMTIME par Arnotic
Source avec Zip Source avec une capture Source .NET (Dotnet) [SILVERLIGHT] UN GÉNÉRATEUR INTERACTIF D'ARBRES DE HUFFMAN par loudadyassine
Source avec Zip Source .NET (Dotnet) [C#2008] OBSERVER L'ACTIVITÉ INPUT (CLAVIER SOURIS) DE L'UTI... par PCPT
Source avec Zip Source avec une capture Source .NET (Dotnet) UTILISATION DE L'API VIRTUAL DISK IMAGE DE WINDOWS 7 par Willi
Source avec Zip Source .NET (Dotnet) CHESS GAME CORE - LIBRAIRIE JEU D'ÉCHEC EN C# par Bidou

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) AJOUTER UNE INFOBULLE À VOS TEXTBOXES par sebmafate
Source avec Zip Source avec une capture Source .NET (Dotnet) BORDEREDPANEL : UN PANEL AVEC LES BORDURES DES FORMULAIRES par sebmafate
Source avec Zip Source avec une capture Source .NET (Dotnet) FENÊTRE SANS BORDURES, POUVANT ÊTRE DÉPLACÉE ET REDIMENSIONN... par LUDINSKI
Source avec Zip Source .NET (Dotnet) NETSENDER ANONYME par morpheus2matrix

Commentaires et avis

Commentaire de tomate69 le 09/12/2003 10:11:06

Grandiose !
Sans vouloir etre trop gourmand,  est-il possible dans le même esprit de modifier le contenu d'un des controles de la fenetre ?

Commentaire de vieuxLion le 09/12/2003 16:53:34

oui, c'est encore plus simple car il n'a a pas besoin d'utiliser le StringBuilder

utilise le WM_SETTEXT
puis la surcharge suivante
    public static extern int GetControlText ( int hwnd, uint wMsg, int wParam, string lParam);
ou tu mets ton nouveau contenu dans lparam.

Commentaire de tomate69 le 11/12/2003 09:52:18

Impeccable ! C'est très drôle, et même si je n'ai pas encore d'idée d'application (En SETTEXT et GETTEXT), je sens que je ne vais pas tarder à en trouver !

Merci, et bravo pour tout vos codes.

Commentaire de gg00xiv le 14/12/2003 13:22:23

Très interessant :) 10/10

Commentaire de plopman le 12/05/2004 18:30:41

sympa ...
Mercii
10/10
PlOpmAn

Commentaire de vdeng le 14/10/2004 23:29:07

Surprenant !
Permet de récupérer du texte !
Dans certaine situation, combiner avec la commande SendKeys !!!

Commentaire de nico23 le 20/05/2005 14:44:50

Salut, cool le source, mais autrement si je veux écrire dans une application Windows ( par exemple la fenêtre active du bureau )? en écrivant dans la barre de titre par exemple ?

Merci de bien vouloir me guider .

Commentaire de DjAdes le 20/08/2005 10:08:39

Bonjour,
Tout d'abord bravo pour cette source et le zip complet.

J'ai essayé la méthode SETTEXT mais je bloque. Comme WM_GETTEXT, WM_SETTEXT doit être défini avec une valeur, quelle est cette valeur ?

Une deuxième chose, en regardant dans la documentation MSDN, je me suis rendu compte qu'ils utilisent WM_SETTEXT dans la méthode SendMessage() et pas GetControlText(). Qu'en est-il exactement ?

Merci d'avance pour vos réponses,
A bientôt,
Seb.

Commentaire de nanomachine2006 le 07/02/2006 11:16:32

la valeur de WM_SETTEXT=12
exemple:
private const int WM_SETTEXT = 12;
reponse a la deuxieme question:
GetControlText() c'est un allias de SendMessage(); tu peux le renommer bon te semble.
pour envoyer le text a une fenetre:
[DllImport("user32.dll", EntryPoint = "SendMessage")]
        public static extern int SetControlText( //renommée pour spécialisation du dernier param
int hwnd, uint wMsg, int wParam, string lParam);//lParam : texte a envoyer dans hwnd
exemple:
SetControlText(hwnd, WM_SETTEXT, 0, tontext);

Commentaire de DjAdes le 28/02/2006 16:48:16

Merci pour cette réponse.

A bientôt,
Seb.

Commentaire de stephanemo le 19/01/2007 14:40:14

Ce source est vraiment ce que je recherchais, par contre je n'arrive pas à récupérer les controles qui sont à l'intérieur d'un conteneur de type groupbox et du coup je suis bloqué.
Merci d'avance pour vos réponses
Steph

Commentaire de stephanemo le 19/01/2007 16:30:34

Je me suis débrouillé, en fait il faut juste dire que le parent c'est le groupbox et faire donc un truc récursif...

Par contre, comment faire pour que ça marche avec des fenêtres à l'intérieur de la fenêtre principale (MDI)?là je vois pas...

Merci.

Steph

Commentaire de johnnous le 25/11/2008 16:04:21

Salut
désole je n'arrive pas à faire fonctionner l'exemple je n'ai pas la fenetre dos et je clique sur ok
l'appli s'arrete

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Débutant paumé [ par Gaasmann ] Bonjour à tous,J'aimerais faire des applications windows en C#. J'ai appris le C# se qui me permet de faire des programmes sous dos( ou console), mais faire dialoguer 2 applications [ par Katalepsy ] salut a tous,voila j'ai besoin de faire passer des données d'une application vers l'autre. les 2 soft ecrit en c# seront sur la meme machine. mais je Certifications [ par MorpionMx ] Bonjour, Je pensais, dès septembre, me mettre a passer 2 - 3 certifications ( Applications Windows C#, Applications Web C# et WebServices + composants SendMessage en .net [ par Fildomen ] Salutest-ce-que SendMessage existe en .net ???http://www.devportail.tk Liste des applications [ par MAQFAB ] Bonjour,J'ai besoin d'aide pour une tâche qui me semble facile mais dont je ne trouve pas le code qui va bien.Mon but est d'appliquer une méthode Brin création de "belles" applications .net [ par morganito ] Bonjour,Je suis actuellement en plein dev d'une application .net, et je me rends vite compte de la limite "graphique" de .net.Quels sont les add-on qu Scroll dans un listview via SendMessage ? [ par Hell Dom ] Bonjour,   V Communication entre applications, comment? [ par safisoft ] Salut tout le monde; Je suis developpeur java, ce sont mes premiers pads en C#; au faite, je me demande comment peut on faire des transferts de donn&# utiliser SendMessage [ par goorgorlou ] salut à tous!voila, j'aimerais à partir de mon code c# lancer une autre appli et puis renseigner plusieur champs de cette appli. j'ai cru co Internet et .NET [ par Machjaghjolu ] Salute, Je débute en .NET et avant de m'y lancer bien, pour ne pas faire le mauvais choix j'aimerai savoir si le .NET est seulement déstin&


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,248 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales