Listez les handles de tous les contrôles d'une application

Résolu
cs_lili83 Messages postés 5 Date d'inscription mardi 5 juillet 2005 Statut Membre Dernière intervention 11 juillet 2005 - 6 juil. 2005 à 09:28
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 - 11 juil. 2005 à 11:49
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

ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 25
11 juil. 2005 à 11:49
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
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 25
6 juil. 2005 à 10:22
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
0
cs_lili83 Messages postés 5 Date d'inscription mardi 5 juillet 2005 Statut Membre Dernière intervention 11 juillet 2005
7 juil. 2005 à 13:53
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.
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 25
7 juil. 2005 à 16:13
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
0

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

Posez votre question
cs_lili83 Messages postés 5 Date d'inscription mardi 5 juillet 2005 Statut Membre Dernière intervention 11 juillet 2005
11 juil. 2005 à 10:05
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 ?
0
cs_lili83 Messages postés 5 Date d'inscription mardi 5 juillet 2005 Statut Membre Dernière intervention 11 juillet 2005
11 juil. 2005 à 10:12
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.
0
cs_lili83 Messages postés 5 Date d'inscription mardi 5 juillet 2005 Statut Membre Dernière intervention 11 juillet 2005
11 juil. 2005 à 10:20
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. =)
0