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