Page 1 sur 1
Handle d'un controle
Publié : mer. 05/janv./2005 21:14
par LOULOU25
Voici mon problême.
Sur une fenetre d'un programme existant , je voudrais pouvoir récupérer le type des controles et leur Handle. Quelqu'un sait-il comment faire ?
Merci par avance
Publié : mer. 05/janv./2005 21:19
par nico
Suffit d'utiliser EnumChildWindow!
J'ai déjà posté une exemple sur le Forum.
Publié : mer. 05/janv./2005 21:22
par LOULOU25
OK Nico merci et ou se trouve ton exemple ?
Merci par avance.
Publié : mer. 05/janv./2005 21:26
par nico
Code : Tout sélectionner
; By Nico
Global HandleEdit
Procedure EnumChildProc(hWnd.l,lParam.s)
Tampon.s=Space(50)
GetClassName_(hWnd, @Tampon, 50)
Debug "hwnd="+Str(hWnd)+" "+"ClassName="+Tampon
If Tampon="Edit"
Tampon1.s=Space(20)
SendMessage_(hWnd,#WM_GETTEXT,20,Tampon1)
;On vérifie que le contenu de l'edit correspond à chemin(lparam)
If lParam=Tampon1
HandleEdit=hWnd
EndIf
EndIf
ProcedureReturn #True
EndProcedure
Chemin.s="C:\"
WindowExploreur = RunProgram("explorer.exe", "/n,/e,"+Chemin+Chr(34), "")
Delay(1000)
FenetreActive.l=GetForegroundWindow_()
EnumChildWindows_(FenetreActive, @EnumChildProc(),Chemin)
Chemin1.s="Poste de travail"
SendMessage_(HandleEdit,#WM_SETTEXT,0,Chemin1)
SendMessage_(HandleEdit,#WM_KEYDOWN,#VK_RETURN,0)
Delay(1000)
Tampon.s=Space(50)
SendMessage_(HandleEdit,#WM_GETTEXT,50,Tampon)
Debug FenetreActive
If Chemin1=Tampon
MessageRequester("Info","L'Edit a bien reçu Le chemin spécifié!")
EndIf
End
Publié : mer. 05/janv./2005 21:35
par LOULOU25
Je vais t'expliquer ce qui a motivé ma demande.
Sur un programme de gestion je dois lire le contenu d'un champ LISTBOX identifié sous le nom "ListBox1", j'ai utilisé des fonctions d'api qui me permette d'extraire le texte mais au lieu d'extraire le texte j'ai eu une chaine de caractére de 4 carctéres supérieure au code ascii 128 alors que la même fonction utilisé sur un listbox classique retourne bien le contenu de l'item.
La seule différence réside dans mon cas dans le fait que l'item est composé de plusieurs zones séparé par des tab
Aurait-tu une idée qui me depannerait ?
Merci par avance
Publié : mer. 05/janv./2005 21:44
par nico
T'as essayé GetWindowText ?
Publié : jeu. 06/janv./2005 17:05
par LOULOU25
Nico,
J'ai essayé également GetWindowText mais là même punition aucune information .
Toutefois avec ton programme d'énumération le type de controle retourné est bien un listbox.
Publié : jeu. 06/janv./2005 22:00
par nico
Tiens un code qui fonctionne:
Code : Tout sélectionner
; By Nico
Global Tampon1.s
Procedure.l EnumChildProc(hWnd.l,lParam.l)
Tampon.s=Space(50)
GetClassName_(hWnd, @Tampon, 50)
Debug "hwnd="+Str(hWnd)+" "+"ClassName="+Tampon
If Tampon="ListBox"
Nb_Octets = SendMessage_( hWnd, #LB_GETTEXTLEN, lParam , 0 )
Tampon1.s=Space(Nb_Octets)
SendMessage_( hWnd, #LB_GETTEXT, lParam, Tampon1 )
r=1
EndIf
ProcedureReturn r
EndProcedure
; Classe et Nom de la fenêtre contenant la ListBox
; Attention, cette fenêtre, je l'ai créé pour les Tests
Fenetre.l=FindWindow_("WindowClass_0","Pure Basic")
Debug Fenetre
Numero_de_ligne=0
If EnumChildWindows_(Fenetre, @EnumChildProc(), Numero_de_ligne)
MessageRequester("Info", Tampon1)
EndIf
End
Publié : ven. 07/janv./2005 21:08
par LOULOU25
Nico,
Salut j'ais essayé ton code, voici le resultat
Une suite de 4 octets > 128
Publié : ven. 07/janv./2005 22:48
par nico
Ecoute, essaye avec la listbox du debugger, pour vérifier que cela fonctionne et tiens moi au courant!
Publié : sam. 08/janv./2005 9:53
par LOULOU25
Avec une LISTBOX classique ta fonction marche parfaitement, je ne comprends pas pourqoui elle ne marche pas avec mon programme.
J'elets une hypothése penses-tu que cette série de quatre chiffres puise être une adresse mémoire dans laquelle le résultat serait copié ? car cette listbox dans sa présentation malgré que la classname soit ListBox ressemble plutôt à une Listview ?
Merci de ton aide