Page 1 sur 2

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

Publié : ven. 13/févr./2009 18:54
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

Publié : sam. 14/févr./2009 0:53
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

Publié : sam. 14/févr./2009 11:27
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:

Publié : sam. 14/févr./2009 12:41
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

Publié : sam. 14/févr./2009 19:33
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)

Publié : sam. 14/févr./2009 20:33
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...

Publié : sam. 14/févr./2009 22:47
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:

Publié : sam. 14/févr./2009 23:00
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:

Publié : dim. 15/févr./2009 11:37
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

Publié : lun. 16/févr./2009 8:20
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

Publié : lun. 16/févr./2009 15:57
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

Publié : lun. 16/févr./2009 16:03
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 

Publié : lun. 16/févr./2009 16:33
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:

Publié : lun. 16/févr./2009 16:45
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

Publié : lun. 16/févr./2009 17:10
par Kwai chang caine
:D