Handle d'un controle

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
LOULOU25
Messages : 150
Inscription : mer. 19/mai/2004 20:40

Handle d'un controle

Message 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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Suffit d'utiliser EnumChildWindow!

J'ai déjà posté une exemple sur le Forum.
LOULOU25
Messages : 150
Inscription : mer. 19/mai/2004 20:40

Message par LOULOU25 »

OK Nico merci et ou se trouve ton exemple ?
Merci par avance.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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
LOULOU25
Messages : 150
Inscription : mer. 19/mai/2004 20:40

Message 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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

T'as essayé GetWindowText ?
LOULOU25
Messages : 150
Inscription : mer. 19/mai/2004 20:40

Message 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.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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
LOULOU25
Messages : 150
Inscription : mer. 19/mai/2004 20:40

Message par LOULOU25 »

Nico,
Salut j'ais essayé ton code, voici le resultat
Une suite de 4 octets > 128
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Ecoute, essaye avec la listbox du debugger, pour vérifier que cela fonctionne et tiens moi au courant!
LOULOU25
Messages : 150
Inscription : mer. 19/mai/2004 20:40

Message 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
Répondre