crée un fichier pb à partir d'une fenêtre en execution

Programmation d'applications complexes
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

crée un fichier pb à partir d'une fenêtre en execution

Message par Patrick88 »

mise à jour du code le 17/02/09

-executer le code suivant,
-dans la liste déroulante choisir une application qui s'exécute.
-cliquer executer.

par défaut l'application crée un source purebasic de la "fenetre capturée"
dans le dossier de compilation.

cette application est limitée au gadget combo, text, string et button.
et elle ne prend pas en compte le style de la fenetre capturée.

vous pourrez l'étendre à loisirs aux autres type de gadgets

attention, cette appli ne "capture" pas le code de l'application, elle ne fait que recréer l'interface avec des commandes purebasic.

comme d'hab (snif) il subsiste un loup, le frame3dgadget et interprété comme un "button" ...

pat

Code : Tout sélectionner

; programme : captureGadget
; objet : génére le code purebasic de "dessin" d'une fenetre windows en cours d'éxecution

Enumeration 
  #FEN_0
  #G_TEXT_FEN_A_CAPTURER:#G_COMBO_FEN_A_CAPTURER
  #G_TEXT_NOM_FICHIER:#G_STRING_NOM_FICHIER:#G_BUTTON_PARCOURIR
  #G_BUTTON_EXECUTER:#G_BUTTON_QUITTER
  
EndEnumeration
  
#Fichier = 0

Structure STRU_INFO_GADGET
  win.l 
  className$ 
EndStructure

EnableExplicit

Global FEN_X.w,FEN_Y.w,FEN_WIDTH.w,FEN_HEIGHT.w, numero_gadget.w, hauteur_barreTitre.w

Procedure.l EnumChildWindowProc(hwnd.l, *cg.STRU_INFO_GADGET) 
  Protected classe$, chaine$, rc.RECT, style.l
  Protected GDT_X.w,GDT_Y.w,GDT_WIDTH.w,GDT_HEIGHT.w
  Protected chaine_sortie.s, chaine_coords.s
    
  If GetParent_(hWnd) = *cg\win 
    classe$=Space(100) 
    chaine$=Space(255)
    GetClassName_(hwnd, @classe$, 100) 
    GetWindowText_(hwnd,@chaine$,255)
    GetWindowRect_(hwnd,@rc)
    style = GetWindowLong_(hwnd, #GWL_EXSTYLE)

    GDT_X = rc\left-FEN_X-2*GetSystemMetrics_(#SM_CYBORDER) : GDT_Y = rc\top-FEN_Y-hauteur_barreTitre : GDT_WIDTH = rc\right-rc\left : GDT_HEIGHT = rc\bottom-rc\top
    chaine_coords = Str(GDT_X)+","+Str(GDT_Y)+","+Str(GDT_WIDTH)+","+Str(GDT_HEIGHT)
    
    Debug classe$
    
    If classe$ = "ComboBox"
      classe$ = "ComboBoxGadget"
      chaine_sortie = classe$+"("+Str(numero_gadget)+","+chaine_coords+")"
      ;;,"+ Chr(34) +chaine$+ Chr(34) 
    EndIf
    If classe$ = "Static"
      classe$ = "textgadget"
      chaine_sortie = classe$+"("+Str(numero_gadget)+","+chaine_coords+","+ Chr(34) +chaine$+ Chr(34) +")"
    EndIf
    If classe$ = "Edit"
      classe$ = "stringgadget"
      chaine_sortie = classe$+"("+Str(numero_gadget)+","+chaine_coords+","+ Chr(34) +chaine$+ Chr(34) +")"
    EndIf
    If classe$ = "Button"
      classe$ = "buttongadget"
      chaine_sortie = classe$+"("+Str(numero_gadget)+","+chaine_coords+","+ Chr(34) +chaine$+ Chr(34) +")"
    EndIf
    
    WriteStringN(#Fichier, chaine_sortie)
    
    numero_gadget+1
  EndIf 
  ProcedureReturn 1 
EndProcedure 

Procedure FEN0_ExecuteCapture(Fichier_Sortie.s)
  Protected winhWnd.l , gadgethWnd.l=0, shctl.l, chaine.s{256} = "", style.l, classe.s{256}
  Protected chaine_sortie.s, chaine_coords.s
  
  Protected window_border.w, WindowRect.RECT,ClientRect.RECT
  
  Protected buffer$ 
  Protected cg.STRU_INFO_GADGET 
  
  If CreateFile(#Fichier,Fichier_Sortie)
    
    winhWnd = Val(StringField(GetGadgetText(#G_COMBO_FEN_A_CAPTURER),1," "))
    
    GetWindowRect_(winhWnd,@WindowRect)   ; encombrement totale de la fenetre
    GetClientRect_(winhWnd,@ClientRect)   ; surface utilisable de la fenetre
    
    window_border = GetSystemMetrics_(#SM_CYBORDER) ; la petite bordure autour de la fentre
    
    hauteur_barreTitre = WindowRect\bottom-WindowRect\top - ClientRect\bottom -2*window_border

    FEN_X = WindowRect\left : FEN_Y = WindowRect\top
    FEN_WIDTH = ClientRect\right-ClientRect\left : FEN_HEIGHT = ClientRect\bottom-ClientRect\top
    
    chaine_coords = Str(FEN_X)+","+Str(FEN_Y)+","+Str(FEN_WIDTH)+","+Str(FEN_HEIGHT)
    chaine_sortie = "openwindow(0"+","+chaine_coords
    chaine_sortie = chaine_sortie +","+ Chr(34) + LTrim(StringField(GetGadgetText(#G_COMBO_FEN_A_CAPTURER),2,"= "))+ Chr(34) + ",#PB_Window_SystemMenu|#PB_Window_SizeGadget)"
    WriteStringN(#Fichier, chaine_sortie)
    
    numero_gadget = 0
       
    gadgethWnd = GetNextDlgTabItem_(winhWnd,winhWnd,#False) 
    buffer$=Space(100) 
    GetClassName_(gadgethWnd, @buffer$, 100) 
    cg\win = winhWnd 
    cg\className$ = buffer$ 
    EnumChildWindows_(winhWnd, @EnumChildWindowProc(),@cg)
    
    chaine_sortie="Repeat"
    WriteStringN(#Fichier, chaine_sortie)
    chaine_sortie = "Until WaitWindowEvent()=#PB_Event_CloseWindow"
    WriteStringN(#Fichier, chaine_sortie)
      
    CloseFile(#fichier)
  EndIf  
EndProcedure

Procedure.l FEN0_INIT()
  Protected col.w=5, lig.w=5
  #fen_larg = 410 : #fen_haut = 100
  #text_larg = #fen_larg/3-10 : #text_haut = 16
  #combo_larg = #fen_larg-#text_larg-10 : #combo_haut = 20
  
  If OpenWindow(#FEN_0,0,0,#fen_larg,#fen_haut,"Capture Gadget v1.0",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
     TextGadget(#G_TEXT_FEN_A_CAPTURER,col,lig+2,#text_larg,#text_haut,"Choisir la fenêtre : ",#PB_Text_Right)
    ComboBoxGadget(#G_COMBO_FEN_A_CAPTURER,col+#text_larg,lig,#combo_larg,#combo_haut)
    lig+30
    TextGadget(#G_TEXT_NOM_FICHIER,col,lig+2,#text_larg,#text_haut,"Nom du fichier purebasic : ",#PB_Text_Right)
    StringGadget(#G_STRING_NOM_FICHIER,col+#text_larg,lig,#combo_larg-20,#combo_haut,"sans_nom.pb")
     ButtonGadget(#G_BUTTON_PARCOURIR,col+#text_larg+GadgetWidth(#G_STRING_NOM_FICHIER),lig,20,#combo_haut,"...")
     lig+40
     col = #fen_larg-#text_larg/1.5
    ButtonGadget(#G_BUTTON_QUITTER,col,lig,#text_larg/1.5-5,#combo_haut,"Quitter")
    col = GadgetX(#G_BUTTON_QUITTER)- #text_larg/1.5
    ButtonGadget(#G_BUTTON_EXECUTER,col,lig,#text_larg/1.5-5,#combo_haut,"Executer")  
  EndIf

  ProcedureReturn WindowID(#FEN_0)
EndProcedure

Procedure FEN0_EXEC()
  Protected event.l, evgad.l , quit.b = 0, nom_fichier.s = ""
  Protected hwnd.l, chaine.s = Space(256)
  
  ;{ auteur : dlolo
  ;; purebasic forum french : http://www.purebasic.fr/french/viewtopic.php?t=3622&start=0&postdays=0&postorder=asc&highlight=list+process
  hWnd = FindWindow_( 0, 0 )
 
  While hWnd <> 0
    If GetWindowLong_(hWnd, #GWL_STYLE) & #WS_VISIBLE = #WS_VISIBLE
      If GetWindowLong_(hWnd, #GWL_EXSTYLE) & #WS_EX_TOOLWINDOW <> #WS_EX_TOOLWINDOW
        GetWindowText_(hWnd,@chaine,256)       
        If chaine <> ""
          AddGadgetItem(#G_COMBO_FEN_A_CAPTURER,-1,Str(hwnd)+" = "+chaine)
        EndIf
      EndIf
    EndIf
    hWnd = GetWindow_(hWnd, #GW_HWNDNEXT)
  Wend
  ;} fin
    
  nom_fichier = GetGadgetText(#G_STRING_NOM_FICHIER)
  Repeat
    event = WaitWindowEvent()
    
    Select event
      Case #PB_Event_Gadget
        evgad = EventGadget()
        Select evgad
          Case #G_COMBO_FEN_A_CAPTURER
          
          Case #G_STRING_NOM_FICHIER
            nom_fichier = GetGadgetText(evgad)
            
          Case #G_BUTTON_PARCOURIR
            nom_fichier = SaveFileRequester("Fichier PureBasic à générer","sans_nom.pb","Texte (*.txt)|*.txt|PureBasic (*.pb)|*.pb",1)
            SetGadgetText(#G_STRING_NOM_FICHIER,nom_fichier)
            
          Case #G_BUTTON_EXECUTER
            FEN0_ExecuteCapture(nom_fichier)
            
          Case #G_BUTTON_QUITTER
            quit = 2
            
        EndSelect
    
      Case #PB_Event_CloseWindow
        quit = 1
        
    EndSelect
    
  Until quit>0
EndProcedure

If FEN0_INIT()>0
  FEN0_EXEC()
EndIf
End
Dernière modification par Patrick88 le mar. 17/févr./2009 11:39, modifié 1 fois.
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Message par GeBonet »

Salut Pat,

Si j'ai bien compris...

1- Tu capture les noms fenêtres actives.
2- Quand il s'agit de ta fenêtre ... (soit de : Capture Gadget v1.0)
2.1 - Le programme retrouve les instructions PB de construction de
la fenêtre (enfin presque)...
3- Mais d'après ce que tu dis tu souhaiterais autre chose des
autres fenêtres actives... Mais alors il faudrait qu'il te trouve quoi ?
(Fenêtres très bien trouvées et placées dans le "ComboBox" d'ailleurs.

4- A remarquer ceci qui est très important :
J'ai lancé un programme en PB qui s'appelle PROGENE V.. :lol:

Le programme "Capture Gadget v1.0" à TRES BIEN Capturé les
Champs et les à écrit dans le fichier "Test.pb"

Voici ce qu'il a créer ! Donc vis à vis de programme PB il semble qu'il capture bien le contenu de la fenêtre ...
Enfin c'est sur le bon chemin...

openwindow(0,256,292,768,440,"PROGENE V 1.0 PB 4.3 Décembre 2008 par : Jourdan g.",#PB_Window_SystemMenu)
textgadget(0,24,86,140,20,"Nom du fichier :")
stringgadget(1,174,86,185,20,"")
textgadget(2,24,126,135,20,"Nom du champ :")
stringgadget(3,174,126,185,20,"")
buttongadget(4,404,41,160,110,"Est-ce une Cléf d'accés")
buttongadget(5,414,61,95,20,"Non")
buttongadget(6,414,81,115,20,"Oui Automatique")
buttongadget(7,414,101,95,20,"Oui Unique ")
buttongadget(8,414,121,135,20,"Cle Double possible")
buttongadget(9,579,41,150,110,"Type du Champ")
buttongadget(10,594,61,100,20,"Alphanumérique")
buttongadget(11,594,81,100,20,"Numérique Entier")
buttongadget(12,594,101,110,20,"Num. Entier Long")
buttongadget(13,594,121,100,20,"Double prècision")
textgadget(14,589,161,75,15,"Longueur : ")
stringgadget(15,664,161,30,15,"")
buttongadget(16,19,166,85,30,"Ajoute Champ")
buttongadget(17,114,166,85,30,"Modifie Champ")
buttongadget(18,209,166,80,30,"Efface Champ")
buttongadget(19,299,166,80,30,"Fin Du Fichier")
buttongadget(19,299,166,80,30,"Fin Du Fichier")
textgadget(21,454,196,265,30,"Fichier et champs en relation")
buttongadget(22,404,181,350,230,"Relations")
textgadget(23,419,231,165,20,"Liaison Avec un autre fichier O/N : ")
stringgadget(24,589,231,17,17,"")
textgadget(25,419,256,165,20,"Nom du fichier concerné : ")
stringgadget(26,589,256,150,20,"")
textgadget(27,414,281,170,20," Nom du champs de la clef :")
stringgadget(28,589,281,150,20,"")
textgadget(29,419,306,165,20,"Champ du fichier concerné : ")
stringgadget(30,589,306,150,20,"")
textgadget(31,419,331,165,20,"A Importer (E) ou a exporter (S) : ")
stringgadget(32,589,331,17,17,"")
textgadget(33,419,356,165,20,"Formule de calcul si utile :")
stringgadget(34,589,356,145,20,"")
textgadget(35,419,381,165,20,"Clause à appliquer si utile :")
stringgadget(36,589,381,145,20,"")
stringgadget(36,589,381,145,20,"")
Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Message par GeBonet »

ReSalut mais Samedi Matin...

Conditions du test :
1- J'ai fait un exe de ta source... Pour tester en dehors de l'environnement PB
2- Idem pour l'écran Progene V...

3- Puis testé sur Progene V... Résultat IDEM Ci dessus... et hier Le principe semble bon...
Sauf qu'il faudrait étendre à toute forme de "champs".. Car il ne prend apparemment que les textesGadget, Les StringGadget et les Boutons...
Qu'il confond d'ailleur entre eux et laisse pas mal de chose de coté.

4- J'ai alors ouvert le carnet d'adresse de OutLook Express et la fenetre Nouveau contact...

J'ai lancé ton programme et.... IL MARCHE AUSSI... Sur une application NON PB. Voir la liste ci-dessous.
A ceci de prêt que c'est idem que pour Progene V...

CONSTAT : Pour que cela marche il faut nécessairement qu'il y aient des "champs" du Texte et des boutons... Que cela vienne de PB ou NON...
Le problème au vue du résultat serait la distinction entre les différent éléments et là je pense aux différents gadgets utilisé.
Et ce quelque soit l'application qui à généré la fenêtre ....

Maintenant à quoi cela pourrais servir ? Sinon recréer un générateur à partir de la capture d'écran...
Si c'est le cas, il vaux mieux se pencher sur la création d'un éditeur du style PureFORM qui serait étendu avec des gadgets de gestion de fichier du style de ce que fait Access. Et à partir de là envisager autre chose...
D'une manière générale, les IDE sont les plateforme de conceptions obligée...

Mais rien n'empêche d'utiliser un ou l'autre IDE existant faisant une partie du travaille et compléter par une autre partie...
C'est l'orientation de l'écran ci dessous (Progene V)... La fenêtre serait créer à partir de PureFORM ou VisualDesigner ou autre chose (même IDE de VB (partie mise en page des objets), puis la source et sauvée...
Le Programme ci-dessous récupère les champs (tout les champs) et demande ce que l'on veux en faire... Mais ce n'est qu'un piste devant l'immensité du désert .... :lol:

Image de ProgeneV pour comparer ce qu'il à saisit :
Image

Et liste saisie d'un contact du Carnet d'adresse de OutLook...

Code : Tout sélectionner

OpenWindow(0,133,31,539,432,"Propriétés de ",#PB_Window_SystemMenu)
TextGadget(0,171,124,51,26,"&Deuxième prénom :")
StringGadget(1,229,124,102,23,"")
TextGadget(2,351,127,36,13,"&Nom :")
StringGadget(3,417,124,102,23,"")
TextGadget(4,16,155,48,13,"F&onction :")
StringGadget(5,66,152,38,23,"")
TextGadget(6,123,155,53,13,"Affic&her :")
TextGadget(6,123,155,53,13,"Affic&her :")
TextGadget(8,349,155,57,13,"Su&rnom :")
StringGadget(9,417,152,102,23,"")
TextGadget(10,16,209,126,13,"Adresses de &messagerie :")
StringGadget(11,145,204,263,23,"")
ButtonGadget(12,417,205,102,23,"&Ajouter")
ButtonGadget(12,417,205,102,23,"&Ajouter")
ButtonGadget(14,417,238,102,23,"Mod&ifier")
ButtonGadget(15,417,265,102,23,"&Supprimer")
ButtonGadget(16,417,293,102,23,"Par dé&faut")
ButtonGadget(17,16,361,335,16,"Envoyer des messages électroniques en texte &brut uniquement.")
ButtonGadget(17,16,361,335,16,"Envoyer des messages électroniques en texte &brut uniquement.")
Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow
Voilà, voilà de quoi travailler...
A+ :lol:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

l'idée est excellente

c'est même étonnant que c'est pas moi qui l'ai eu :lol:

vous etes égoïste, car vous pensez pas a mOA !! :D
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Bah j'avais testé, mais j'avais pas compris, comme dab :oops:
Je viens de comprendre grace a GEBONET a quoi sert ton programme :D

Il a raison le DOBRO, l'idée elle est bonne et surtout originale 8O

C'est "zarbi" qu'il ne repere pas les fenetre non PB :roll:
Peut etre que du coté du forum US y'aurais des codes de NETMAESTRO qui peuvent lister les objets d'un programme :roll:
Enfin comme dab, c'est pas de mon niveau, alors je vais pas pourvoir t'etre beaucoup utile.

Mais encore bravo pour l'idée, je pense qu'elle va plaire 8)
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Message par GeBonet »

Ben si il les repère.... Il faut tout lire...KCC : :lol:
4- J'ai alors ouvert le carnet d'adresse de OutLook Express et la fenetre Nouveau contact...

J'ai lancé ton programme et.... IL MARCHE AUSSI... Sur une application NON PB. Voir la liste ci-dessous.
A ceci de prêt que c'est idem que pour Progene V...

CONSTAT : Pour que cela marche il faut nécessairement qu'il y aient des "champs" du Texte et des boutons... Que cela vienne de PB ou NON...
Le problème au vue du résultat serait la distinction entre les différent éléments et là je pense aux différents gadgets utilisé.
Et ce quelque soit l'application qui à généré la fenêtre ....
C'était écrit...
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Désolé :oops:

Mais moi j'ai pas eu de chance, j'ai essayé sur deux appli exterieur, et j'ai eu X fois la meme fenetre (Avec le meme ID d'ailleurs) :roll:
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Message par GeBonet »

Pour que ça marche, il faut d'abord charger l'application extérieur et la placer avec une fenetre ou il y a des champs de saisie, boutons etc...

Puis lancer l'application "Capture Gadget v1.0"... là il faut sélectionner avec le combobox la fenêtre de l'application ouverte avec les "champs"... Une fois fait donner un nom et clicker sur exécuter... Puis quitter... Le résultat devrait se trouver dans le fichier du nom donné et d'extension que tu met qui peut-être ".pb"... Ce qui est amusant à faire car alors cela s'execute avec l'IDE... Pas bien, mais ça le fait... :lol:
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Pas mal.
Sur tous les tests que j'ai fait j'ai eu le même bug: des Gadgets sont dupliqués (la création d'un même gadget est en plusieurs fois).

/Lio
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

à geBonet: tout à fait exact, je n'aurais pu dire mieux..
normal que tu puisses l'éxecuter avec pb, "c'est fait pour" :lol:
cf: openwindow+boucle repeat until waitwindowevent
par contre "il" ne capture pas les options de la fenetre. ce n'était pas le but.

à lionel_om: oui, c'est surement dû à "ma" métode de recherche des objets... cf post de kcc et réponse.

à kcc, bin en fait, en fouillant sur le forum je suis tombé sur un code que tu as posté, et qui correspondait à cela... :wink: à peu de chose près. :lol:
http://www.purebasic.fr/french/viewtopi ... ght=handle

prochaine étape, étendre la recherche aux autres objets, là il ne traite que les "classes" static / edit / button.

ce code m'est venu lorsque j'ai voulu importer une fenetre dans le pureform de gnozal, la fonction importer "n'aime" pas les constantes dans les paramétres de placement des objets, et comme j'avais la flemme de corriger ma fenêtre... :lol:

pat
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

et yop, c'est encore KCC qui à mis le doigt sur la solution, ou du moins l'idée conductrice.
http://www.purebasic.fr/english/viewtop ... tclassname

quel génie ce KCC :?

je cherchais également comment fonctionnait le EnumChildWindows_() , cool.

Code : Tout sélectionner

; http://www.purebasic.fr/english/viewtopic.php?t=30961 
; Codé par SROD 

Structure _countgadgets 
  win.l 
  className$ 
  count.l 
EndStructure 

Procedure.l EnumChildWindowProc(hwnd, *cg._countgadgets) 
  Protected buffer$ 
  If GetParent_(hWnd) = *cg\win 
    buffer$=Space(100) 
    GetClassName_(hwnd, @buffer$, 100) 
    If buffer$ = *cg\className$ 
      *cg\count + 1 
    EndIf 
  EndIf 
  ProcedureReturn 1 
EndProcedure 

;The following function takes a window handle and a gadget handle and returns a count of the 
;number of similar controls on the given window. 
;This count includes the specified gadget. 

Procedure.l CountSimilarGadgets(winhWnd, gadgethWnd) 
  Protected buffer$ 
  Protected cg._countgadgets 
  If IsWindow_(winhWnd) And IsWindow_(gadgethWnd) 
    buffer$=Space(100) 
    GetClassName_(gadgethWnd, @buffer$, 100) 
    cg\win = winhWnd 
    cg\className$ = buffer$ 
    EnumChildWindows_(winhWnd, @EnumChildWindowProc(),@cg) 
  EndIf 
  ProcedureReturn cg\count 
EndProcedure 


If OpenWindow(0, 100, 100, 600, 600, "Count gadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 
  
 For o = 1 To 2 
  TextGadget(100 + o, 10, 30 + (o * 30), 47, 20, "Base", #PB_Text_Center) 
  ComboBoxGadget(120 + o, 50, 30 + (o * 30), 90, 300, #PB_ComboBox_Editable) 
  StringGadget(140 + o, 150, 30 + (o * 30), 330, 20, "") 
 Next 
        
 Debug "There are " + Str(CountSimilarGadgets(WindowID(0), GadgetID(101)))  + " TextGadget" 
 Debug "There are " + Str(CountSimilarGadgets(WindowID(0), GadgetID(121))) + " Combo" 
 Debug "There are " + Str(CountSimilarGadgets(WindowID(0), GadgetID(141))) + " String" 

  Repeat 
    event = WaitWindowEvent() 
  Until event = #PB_Event_CloseWindow 
EndIf 
End
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

code de NetMaestro, très interessant également
en survolant les fenetres et leurs "gadgets" on en obtient une description .
http://www.purebasic.fr/english/viewtop ... tclassname

Code : Tout sélectionner

;============================================================== 
; Program:         Digger 
; Author:          Lloyd Gallant (netmaestro) 
; Date:            December 20, 2007 
; Target OS:       Microsoft Windows All 
; Target Compiler: PureBasic 4.0 and later 
; License:         Free, unrestricted, use at your own risk 
;============================================================== 

OpenWindow(0,0,0,440,64,"",#PB_Window_BorderLess|#WS_BORDER|#PB_Window_Invisible) 
StickyWindow(0,1) 
wclight =  RGB(255,255,223) 
wcdark  =  RGB(235,235,203) 
SetWindowColor(0,wclight) 
ExamineDesktops() 
screenw = DesktopWidth(0) 
screenh = DesktopHeight(0) 
CreateGadgetList(WindowID(0)) 
TextGadget(0,0,0,100,16,"") 
TextGadget(1,60,0,80,16,"Hwnd") 
TextGadget(2,140,0,100,16,"Caption") 
TextGadget(3,240,0,60,16,"Ctrl ID") 
TextGadget(4,300,0,140,16,"Classname") 
TextGadget(5,0,16,60,10,"") 
TextGadget(6,0,26,60,16,"Window:") 
TextGadget(7,0,42,60,22,"   Parent:") 
TextGadget(8,60,26,80,16,"") 
TextGadget(9,140,26,100,16,"") 
TextGadget(10,240,26,60,16,"") 
TextGadget(11,300,26,140,16,"") 
TextGadget(12,60,42,80,16,"") 
TextGadget(13,140,42,100,16,"") 
TextGadget(14,240,42,60,16,"") 
TextGadget(15,300,42,140,16,"") 
For i=0 To 7 
  SetGadgetColor(i,#PB_Gadget_BackColor,wcdark) 
Next 
For i=8 To 15 
  SetGadgetColor(i,#PB_Gadget_BackColor,wclight) 
Next 
HideWindow(0,0) 

Repeat 
  Delay(1) 
  ev=WindowEvent() 
  x=DesktopMouseX():y=DesktopMouseY() 
  If x > screenw-WindowWidth(0) 
    wx = x-WindowWidth(0) 
  Else 
    wx = x+10 
  EndIf 
  If y >= screenh-WindowHeight(0)+20 
    wy = y-WindowHeight(0)-10 
  Else 
    wy = y+20 
  EndIf 
  ResizeWindow(0, wx, wy, #PB_Ignore, #PB_Ignore) 
  hwnd = WindowFromPoint_(x|y<<32) 
  If hwnd<>oldhwnd Or ev=#PB_Event_Repaint 
    hwnd$ = Hex(hwnd) 
    caption$ = Space(100) 
    GetWindowText_(hwnd, @caption$, 99) 
    ctrlid$ = Str(GetWindowLong_(hwnd, #GWL_ID)) 
    class$ = Space(140) 
    GetClassName_(hwnd, @class$, 139) 
    SetGadgetText(8, hwnd$) 
    SetGadgetText(9, caption$) 
    SetGadgetText(10, ctrlid$) 
    SetGadgetText(11, class$) 
    parent = GetParent_(hwnd) 
    parent$ = Hex(parent) 
    caption$ = Space(100) 
    GetWindowText_(parent, @caption$, 99) 
    ctrlid$ = Str(GetWindowLong_(parent, #GWL_ID)) 
    class$ = Space(140) 
    GetClassName_(parent, @class$, 139) 
    SetGadgetText(12, parent$) 
    SetGadgetText(13, caption$) 
    SetGadgetText(14, ctrlid$) 
    SetGadgetText(15, class$) 
    oldhwnd = hwnd    
    RedrawWindow_(WindowID(0),0,0,#RDW_UPDATENOW) 
  EndIf 

Until GetAsyncKeyState_(#VK_RBUTTON) & 32768 
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

quel génie ce KCC
Je te remercie ...mais c'est "boucou trop de la honnir" :oops:
KCC comme il connait rien, il ramasse tous les codes de tous le monde, c'est comme ça qu'il savait que ces codes existaient :D

Par contre, je te les aurais bien donnés, mais je pensais pas par exemple que celui de NETMAESTRO aurait pu t'interesser, car il faut que l'on promene la souris

Et toi il faudrait un qui donne la liste sans promener la souris .....Hummmmm !!!
Faut qu'je fouine, ça me donne un idée, j'sais pas si celui la tu l'as ????
Il est de Philip felixer (Ya meme la couleur)

Code : Tout sélectionner

; read the text contents of all (known) window classes (debug tool) 
; ---------------------------------------------------- 
; known classes: 
; -------------- 
; v syslistview32 
; v systreeview32 
; v static 
; v button 
; v combobox 
; v listbox 
; * ToolbarWindow32 
; - 

; structures 
Structure window 
   window.l 
   title.s 
   class.s 
   parent.l 
EndStructure 

; globals 
Global NewList win.window() 
Global NewList win1.window() 
Global parent.l 

; read treeview 
Procedure readsystreeview32(hTreeView) 
    Define TVItem.TV_ITEM 
    Buffer = AllocateMemory(100) 
    GetWindowThreadProcessId_(hTreeView, @ProcID)    
    hProc = OpenProcess_(#PROCESS_VM_OPERATION | #PROCESS_VM_READ | #PROCESS_VM_WRITE, 0, ProcID) 
    Result = VirtualAllocEx_(hProc, 0, SizeOf(TV_ITEM), #MEM_RESERVE | #MEM_COMMIT, #PAGE_READWRITE) 
    TVItem\mask = #TVIF_TEXT | #TVIF_HANDLE 
    TVItem\pszText = Result +400 
    TVItem\cchTextMax = 100 
    If hTreeView 
      For i = 0 To SendMessage_(hTreeView, #TVM_GETCOUNT, 0, 0)-1 
        hItem = SendMessage_(hTreeView, #TVM_GETNEXTITEM, #TVGN_ROOT, 0) 
        For ii.l = 0 To i-1 
          hItem2 = SendMessage_(hTreeView, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem) 
          Repeat 
            If hItem2 = #Null : hItem2 = SendMessage_(hTreeView, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem) : EndIf 
            If hItem2 = #Null : hItem = SendMessage_(hTreeView, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem) : EndIf 
          Until hItem2 <> #Null 
          hItem = hItem2 
        Next ii 
        TVItem\hItem = hItem 
        WriteProcessMemory_(hProc, Result, @TVItem, SizeOf(TV_ITEM), 0) 
        SendMessage_(hTreeView, #TVM_GETITEM, 0, Result) 
        ReadProcessMemory_(hProc, Result +400, Buffer, MemorySize(Buffer), 0) 
        Debug "("+Str(i)+")"+PeekS(Buffer) 
      Next i 
    EndIf 
    VirtualFreeEx_(hProc, Result, 0, #MEM_RELEASE) 
CloseHandle_(hProc) 
EndProcedure 

; read listview 
Procedure readsyslistview32(listview) 
    count=SendMessage_(listview, #LVM_GETITEMCOUNT, 0, 0); 
    Debug("listview: " + Str(listview)) 
    Debug("Row count: " + Str(count)) 
    lvi.LVITEM 
    *_lvi.LVITEM 
    item.s=Space(512) 
    subitem.s=Space(512) 
    GetWindowThreadProcessId_(listview, @pid) 
    process=OpenProcess_(#PROCESS_VM_OPERATION|#PROCESS_VM_READ|#PROCESS_VM_WRITE|#PROCESS_QUERY_INFORMATION, #False, pid) 
    *_lvi=VirtualAllocEx_(process, #Null, SizeOf(LVITEM), #MEM_COMMIT, #PAGE_READWRITE) 
    *_item=VirtualAllocEx_(process, #Null, 512, #MEM_COMMIT, #PAGE_READWRITE) 
    *_subitem=VirtualAllocEx_(process, #Null, 512, #MEM_COMMIT, #PAGE_READWRITE) 
    lvi\cchTextMax=512 
    For i=0 To count-1 
        lvi\iSubItem=0 
        lvi\pszText=*_item 
        WriteProcessMemory_(process, *_lvi, @lvi, SizeOf(LVITEM), #Null) 
        SendMessage_(listview, #LVM_GETITEMTEXT, i, *_lvi) 
        lvi\iSubItem=1 
        lvi\pszText=*_subitem 
        WriteProcessMemory_(process, *_lvi, @lvi, SizeOf(LVITEM), #Null) 
        SendMessage_(listview, #LVM_GETITEMTEXT, i, *_lvi) 
        ReadProcessMemory_(process, *_item, item, 512, #Null) 
        ReadProcessMemory_(process, *_subitem, subitem, 512, #Null) 
        Debug("Row: " + Str(i)) 
        Debug("Item: " + item) 
        Debug("Subitem: " + subitem) 
    Next 
    VirtualFreeEx_(process, *_lvi, 0, #MEM_RELEASE) 
    VirtualFreeEx_(process, *_item, 0, #MEM_RELEASE) 
    VirtualFreeEx_(process, *_subitem, 0, #MEM_RELEASE) 
    CloseHandle_(process) 
EndProcedure 

;List top-level windows' children (called by ListWindows)... 
Procedure ListChildWindows (window, parameter) 
    mem = AllocateMemory (255) 
    GetClassName_ (window, mem, 255) 
    class$ = PeekS (mem) 
    mem = ReAllocateMemory (mem, 255) 
    GetWindowText_ (window, mem, 255) 
    title$ = PeekS (mem) 
    FreeMemory (mem) 

    AddElement(win()) 
    win()\window = window 
    win()\title  = title$ 
    win()\class  = class$ 
    win()\parent = parent 

    EnumChildWindows_ (window, @ListChildWindows (), parameter + 1) 
    ProcedureReturn #True 
EndProcedure 

; List top-level windows... 
Procedure ListWindows (window, parameter) 
    mem = AllocateMemory (255) 
    GetClassName_ (window, mem, 255) 
    class$ = PeekS (mem) 
    mem = ReAllocateMemory (mem, 255) 
    GetWindowText_ (window, mem, 255) 
    title$ = PeekS (mem) 
    FreeMemory (mem) 

    AddElement(win()) 
    win()\window = window 
    win()\title  = title$ 
    win()\class  = class$ 
    win()\parent = 0 
    
    parent=window 
    
    EnumChildWindows_ (window, @ListChildWindows (), 1) 
    ProcedureReturn #True 
EndProcedure 

; list all windows in listicongadget 
Procedure listallwindows() 
      EnumWindows_ (@ListWindows (), 0) 
      ResetList(win()) 
      While NextElement(win()) 
         If CountList(win1())=0 
            AddElement(win1()) 
            win1()\title = win()\title 
            win1()\class = win()\class 
            win1()\window= win()\window 
            win1()\parent= win()\parent 
         Else 
            dubbel=0 
            ResetList(win1()) 
            While NextElement(win1()) 
               If win1()\window = win()\window 
                  dubbel=1 
                  DeleteElement(win()) 
                  LastElement(win1()) 
               EndIf 
            Wend 
            If dubbel=0 
               AddElement(win1()) 
               win1()\title = win()\title 
               win1()\class = win()\class 
               win1()\window= win()\window 
               win1()\parent= win()\parent      
            EndIf 
         EndIf 
      Wend 
      ClearList(win1()) 
      ClearGadgetItemList(0) 
      ResetList(win()) 
      While NextElement(win())        
         AddGadgetItem(0, -1, Chr(34)+win()\title+Chr(34)+Chr(10)+Chr(34)+win()\class+Chr(34)+Chr(10)+Str(win()\window)+Chr(10)+Str(win()\parent)) 
         ;If IsWindowVisible_(win()\window) 
            If win()\parent=0 
               SetGadgetItemColor(0, ListIndex(win()), #PB_Gadget_FrontColor, RGB(0,0,255))                    
            Else 
               Select win()\class 
                  Case "SysListView32", "SysTreeView32", "Static", "Button", "ComboBox", "ListBox", "ToolbarWindow32" 
                     SetGadgetItemColor(0, ListIndex(win()), #PB_Gadget_FrontColor, RGB(0,255,0))          
                  Default 
                     SetGadgetItemColor(0, ListIndex(win()), #PB_Gadget_FrontColor, RGB(255,0,0))          
               EndSelect 
            EndIf 
         ;Else      
         ;   SetGadgetItemColor(0, ListIndex(win()), #PB_Gadget_FrontColor, RGB(0,0,0)) ;Color [, Column]) 
         ;EndIf 
      Wend 
EndProcedure 

;{ main loop 
If OpenWindow(0, 10, 10, 660, 560, "Windows", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
   If CreateGadgetList(WindowID(0)) 
      ListIconGadget(0, 10, 10, 640, 500, "Title", 200, #PB_ListIcon_FullRowSelect) 
      AddGadgetColumn(0, 2, "Class", 200) 
      AddGadgetColumn(0, 3, "WindowID", 100) 
      AddGadgetColumn(0, 4, "ParentID", 100) 
      ButtonGadget(1, 10, 510, 60, 20, "Refresh") 
      ButtonGadget(2, 70, 510, 60, 20, "Draw") 
      ButtonGadget(3, 130,510, 60, 20, "Items") 
      DisableGadget(2, #True) 
      DisableGadget(3, #True) 
      listallwindows() 
      Repeat 
         wevent=WaitWindowEvent() 
         If wevent=#PB_Event_Gadget 
            Select EventGadget() 
               Case 0 
                  gad = GetGadgetState(0) 
                  SelectElement(win(), gad) 
                  If win()\parent=0 
                      DisableGadget(2, #False) 
                  Else 
                      DisableGadget(2, #True) 
                  EndIf 
                  Select win()\class 
                     Case "SysListView32", "Static", "Button", "ComboBox", "ListBox", "ToolbarWindow32" 
                        DisableGadget(3, #False) 
                     Case "SysTreeView32" 
                        DisableGadget(3, #False) 
                     Default 
                        DisableGadget(3, #True)  
                  EndSelect                        
               Case 1 
                  listallwindows() 
               Case 2 
                  gad = GetGadgetState(0) 
                  SelectElement(win(), gad) 
                  window = win()\window 
                  title.s = win()\title 
                  class.s = win()\class 
                  GetWindowRect_(window, @r.Rect) 
                  sx = r\left 
                  sy = r\top 
                  width = r\right-r\left 
                  height= r\bottom-r\top                  
                  dc = GetWindowDC_(win()\window) 
                  If CreateImage(0, width, height, 32) 
                     StartDrawing(ImageOutput(0)) 
                        col1 = GetBkColor_(dc) 
                        Box(0, 0, width, height, col1) 
                        While NextElement(win()) 
                           If win()\parent = window 
                              GetWindowRect_(win()\window, @r.Rect) 
                              dc = GetWindowDC_(win()\window) 
                              col = GetBkColor_(dc) 
                              Box(r\left-sx, r\top-sy, r\right-r\left, r\bottom-r\top, RGB(0,0,0)) 
                              Box(r\left-sx+1, r\top-sy+1, r\right-r\left-2, r\bottom-r\top-2, col) 
                              If Len(win()\class) 
                                 DrawText((r\left-sx)+((r\right-r\left)/2)-(TextWidth(win()\class)/2), (r\top-sy)+((r\bottom-r\top)/2)-(TextHeight(win()\class)/2), win()\class) 
                              EndIf 
                           Else 
                              LastElement(win()) 
                           EndIf 
                        Wend 
                     StopDrawing() 
                     wi.Windowinfo 
                     GetWindowInfo_(window, @wi) 
                     If OpenWindow(1, sy, sx, width, height, "", #PB_Window_BorderLess|#PB_Window_ScreenCentered)                        
                        ;SetWindowLong_(WindowID(1), #GWL_STYLE, wi\dwstyle) 
                        ;SetWindowPos_(WindowID(1), #HWND_TOPMOST, sx, sy, WindowWidth(1), WindowHeight(1), #SWP_FRAMECHANGED) ;                        
                        StartDrawing(WindowOutput(1)) 
                           DrawImage(ImageID(0), 0, 0) 
                        StopDrawing() 
                        Repeat                        
                           wevent=WaitWindowEvent() 
                        Until wevent=#PB_Event_CloseWindow 
                        wevent=0 
                        CloseWindow(1) 
                     EndIf 
                  EndIf 
               Case 3 
                  gad = GetGadgetState(0) 
                  SelectElement(win(), gad) 
                  Select win()\class 
                      
                     Case "SysListView32" 
                        readsyslistview32(win()\window)                        
                      
                     Case "SysTreeView32" 
                        readsystreeview32(win()\window) 
                      
                     Case "Button", "Static" 
                        mem = AllocateMemory (255) 
                        GetClassName_ (win()\window, mem, 255) 
                        Debug PeekS(mem) 
                        mem = ReAllocateMemory (mem, 255) 
                        GetWindowText_ (win()\window, mem, 255) 
                        Debug PeekS(mem) 
                        FreeMemory (mem) 
                        
                     Case "ComboBox" 
                        items = SendMessage_(win()\window, #CB_GETCOUNT, 0, 0) 
                        If items 
                           For a = 0 To items-1 
                              len = SendMessage_(win()\window, #CB_GETLBTEXTLEN, a, 0) 
                              str$ = Space(len+1) 
                              SendMessage_(win()\window, #CB_GETLBTEXT, a, @str$) 
                              Debug str$ 
                           Next 
                        EndIf 
                        
                     Case "ListBox" 
                        items = SendMessage_(win()\window, #LB_GETCOUNT, 0, 0) 
                        If items 
                           For a = 0 To items-1 
                              len = SendMessage_(win()\window, #LB_GETTEXTLEN, a, 0) 
                              str$ = Space(len+1) 
                              SendMessage_(win()\window, #LB_GETTEXT, a, @str$) 
                              Debug str$ 
                           Next 
                        EndIf  
                                            
                     Case "ToolbarWindow32" 
                        items = SendMessage_(win()\window, #TB_BUTTONCOUNT, 0, 0) 
                        If items 

                        EndIf 
                                              
                     Default 
                  EndSelect                
            EndSelect 
         EndIf 
      Until wevent=#PB_Event_CloseWindow 
   EndIf 
EndIf 
;} 

;{ The end 
End 
;} 
Bas dis donc mon bon PAtrick, si avec tous ces jolis codes des plus grands MAITRES tu nous fait pas un avion ....
T'auras plus qu'a venir jouer dans le tas de sable de KCC :oops:
Tu verras il est cool il te preteras sa pelle et son sceau :lol:
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

ahque oui là dis donc... je l'avais point vu celui là. exact'ly ce qu'il me faut... milles merci, oh très grand K :wink:

pat
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

:D
Répondre