-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