Listez les handles de tous les contrôles d'une application [Résolu]

Signaler
Messages postés
5
Date d'inscription
mardi 5 juillet 2005
Statut
Membre
Dernière intervention
11 juillet 2005
-
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
-
Bonjour,

Je suis débutante en programmation et j'ai quelques soucis.
Avant de poster ce message, je me suis assurée de bien chercher sur le forum.

Ce que je cherche:

Un code qui me permet de lister tous les contrôles d'un appli, accessoirement de pouvoir m'assurer de la nature des contrôles listés.

J'ai déjà trouvé une fonction EnumChildWindow:

EnumChildWindows HANDLE_APPLICATION, AddressOf EnumChildProc,ByVal 0&

avec le code de la fonction EnumChildProc.

Je ne comprends pas bien comment marche cette fonction.
Quelqu'un pourrait-il me donner un exemple explicite ?

Je vous remercie bien.

Lili.

7 réponses

Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
16
salut,



euh, j'avais oublié ça...avec handle, tu fais un simple
SendMessage(handle,WM_SETTEXT,Byval 0&,Byval
strTa_chaine)...strTa_chaine, il vaut mieux que ce ne soit pas une
constante...



D'après MSDN :

SetForegroundWindow ca marche pour donner le focus à n'importe quelle appli...

ShareVB
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
16
salut,



déjà, si ca n'est pas une appli externe, il y a plus simple...



sinon :

-> HANDLE_APPLICATION, c'est le handle de la fenêtre principale (au
moins dans ton cas). TU le trouve avec FindWindow ou FindWindowEx (avec
le titre et/ou la classe (nature du contrôle) de ta fenêtre principale)
->
Dans EnumChildProc (dans un module BAS), tu reçois un handle à chaque
appel...avec ce handle, tu peux trouver le titre de la fenêtre
(GetWindowText) et sa classe (GetClassName), cad son type dont le nom
de ne correspond pas à un de ceux de VB (par ex : Label = Static, il me
semble)



Pour ce qui est du fonctionnement, EnumChildWindows demande le handle
de la fenêtre père, et liste toutes les fenêtres descendantes. A chaque
fenêtre trouvée, il appelle EnumChildProc en lui donnant le handle,
jusqu'à ce que EnumChildProc renvoie 0 ou qu'il n'y en ait plus....


ShareVB
Messages postés
5
Date d'inscription
mardi 5 juillet 2005
Statut
Membre
Dernière intervention
11 juillet 2005

Merci pour ton aide!

En fait, Il fallait impérativement définir la fonction EnumChildProc.

Je pensais que n'importe quel nom pouvait être appelé.
Du coup, je suis bien arrivée à lister tous les handles.

Mais maintenant je suis face à un nouveau pbm.
Il m'interesserait de pouvoir changer pluieurs champs textes de cette application externe.

Je définis des méthodes de ce genre:

Public Sub setText1 ()
SetForegroundWindow( HandleText1)
Sendkeys "Mon texte1", -1
End Sub

j'appelle successivemet ce genre de méthodes et hélas un coup sur 10 ca marche comme il faut. La plupart du temps, les champs textes ne sont pas placés dans le bon champ de l'appli externe. Genre, "Mon texte1" sera placé dans le Handle de Text2. Pourtant je vérifie les handles correspondent.
¨Peut être quelqu'un à une astuce pour remplir PLUSIEURS champs texte d'une appli externe et de manière successive.

Lili.
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
16
salut,



pour info, tu peux changer le nom de la procédure mais pas son prototype (2 paramètres Long et un retour Long)...



si tu as une liste des tes handles, utilises SetWindowText avec le
handle de chacun de tes textbox...la méhode sendkeys est
OBLIGATOIREMENT hasardeuse...

ShareVB
Messages postés
5
Date d'inscription
mardi 5 juillet 2005
Statut
Membre
Dernière intervention
11 juillet 2005

Bonjour,


c'est gentil de m'aider.


Bon; alors j'ai essayé avec SetWindowText mais ca fonctionne encore moins bien qu'avec mes SendKeys. Je suis certaine d'avoir le bon handle puisqu' avec les SendKey ca marche. Alors pour essayer SetWindowText j'ai fait:


Result = SetForegroundWindow( handle )
Result = SetWindowText( handle, "Youpi " )


Et bien ca me met le texte en surveillance mais il n'a pas été changé.
Méchante zone de texte!
Un autre truc, je voudrais bien savoir qui fait quoi entre :
SetActiveWindow
SetForegroundWindow
SetFocus
Pour changer le texte d'un zone de texte d'un appli externe, y a peut etre des contraintes du genre:
- Faut que la zone de texte aie le focus ?
-Faut que la fenêtre soit active au premier plan ?

En attendant ta réponse, je te souhaite une bonne journée.

Lili. Pourquoi elle veut pas marcher la bestiole dans l'ordinateur ?
Messages postés
5
Date d'inscription
mardi 5 juillet 2005
Statut
Membre
Dernière intervention
11 juillet 2005

D'ailleurs je viens de trouver ca sur msdn microsoft:

The SetWindowText function changes the text of the specified window's title bar (if it has one). If the specified window is a control, the text of the control is changed. However, SetWindowText cannot change the text of a control in another application.

=)
Lili.
Messages postés
5
Date d'inscription
mardi 5 juillet 2005
Statut
Membre
Dernière intervention
11 juillet 2005

Du coup c'est ca:

To set the text of a control in another process, send the WM_SETTEXT message directly instead of calling SetWindowText. et donc apres il doit falloir utiliser les sendKeys. =)