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

Programmation d'applications complexes
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Message par GeBonet »

Dans le même registre il y a aussi ce que SDI avait poster
Et que j'ai un peu modifié pour expliquer les choses...


; *********************************************************
; Auteur : Le Soldat Inconnu Version de PB : 4
; Explication du programme : Trouver le nom du programme à partir de l'ID d'une fenêtre
; ----------------------------------------------------------------------
; Structure pour recevoir les coordonnées de la souris....
; Adaptation et commenté GeBonet
; ***********************************************************
Structure Coordonnee ;{-
        x.l
        y.l
EndStructure ;}-
Position.Coordonnee ; Et pouvoir lire les positions x,y par lecture à l'adresse
; ***********************************************************************************
; - Procédure pour récupérer le nom de la fenêtre "WindowID"
; ***********************************************************************************
Procedure.s ProgramfileNameFromWindow( windowid )
     Protected ProcessID, Process32, Snapshot, ProcessEntry.PROCESSENTRY32, ProgramfileName.s
     GetWindowThreadProcessId_ ( windowid , @ProcessID)
    Process32 = openlibrary ( #PB_Any , "kernel32.dll" )
     If Process32
        Snapshot = callfunction (Process32, "CreateToolhelp32Snapshot" , #TH32CS_SNAPPROCESS , 0)
         If Snapshot
            ProcessEntry\dwSize = sizeof (PROCESSENTRY32)
             If callfunction (Process32, "Process32First" , Snapshot, @ProcessEntry)
                 Repeat
                     If ProcessID = ProcessEntry\th32ProcessID
                         programfilename = peeks (@ProcessEntry\szExeFile)
                        Break
                     EndIf
                 Until callfunction (Process32, "Process32Next" , Snapshot, @ProcessEntry) = 0
             EndIf
           CloseHandle_ (Snapshot)
         EndIf
         closelibrary (Process32)
     EndIf
     ProcedureReturn programfilename
EndProcedure
; ***********************************************************************************
; Création de la fenêtre et de la GadgetList
; ------------------------------------------------------
Parametre= #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget

If openwindow (0, 0, 0, 300, 200, "Test" , Parametre) = 0
     End
EndIf
;
     stickywindow (0, 1)
     textgadget (0, 5, 5, 100, 20, "" ) : textgadget (4, 100, 5, 200, 20, "" )
     textgadget (1, 5, 25, 290, 20, "" )
     textgadget (2, 5, 55, 290, 20, "" ) ; Affiche X
     textgadget (3, 45, 55, 290, 20, "" ) ; Affiche Y
    
     textgadget (7, 5,90,300,20, " J'affiche la fenêtre ou je passe" )
     textgadget (8, 5,110,300,20, " Et les positions Souris d'origines différentes" )
    
     textgadget (5, 300-80, 200-30, 290, 20, "" ) ; Affiche X
     textgadget (6, 300-40, 200-30, 290, 20, "" ) ; Affiche Y
    
     SetTimer_ ( windowid (0), 1, 100, 0)
;
Repeat
    Event = waitwindowevent ()
     Select Event
         Case #WM_TIMER
             Select eventwparam ()
                 Case 1
                    Position\x= desktopmousex () ; Position
                    Position\y= desktopmousey () ; Position y
                     ; ; WindowFromPoint_ demande le "Point" pour avoir le Handle de la fenetre
                     ; ************************************************************
                    Fenetre = WindowFromPoint_ (Position\x|Position\y<<32) ; <<<<<< Forme qui remplace l'ancien ==> WindowFromPoint_(x,y)
                     ; ************************************************************
                    Texte.s =ProgramfileNameFromWindow(Fenetre) ; Avec le Handle je Trouve le nom de la fentre (avec Procédure ci-dessus)
                     ;
                     setgadgettext (0, str (@Position)) ; Que j'écrit dans e stringGadet(0,...) @Coordonnee
                     setgadgettext (1, str (Fenetre)) ; Que j'écrit dans e stringGadet(0,...)
                     ;
                     setgadgettext (2, "x=" + str (Position\x)) ; Position donnéé Par DesktopMouseX()
                     setgadgettext (3, "y=" + str (Position\y)) ; Position donnéé Par DesktopMouseY()
                     ;
                     setgadgettext (4, " Fenetre =" +Texte)
                     ; Position donnéé l'adresse de référence mémoire @Position
                     setgadgettext (5, "xb=" + str ( peekl (@Position))) ; Position donnéé Par l'adresse mémoire de X
                     setgadgettext (6, "yb=" + str ( peekl (@Position+4))) ; Position donnéé Par l'adresse mémoire de Y
                     ;
             EndSelect
         Case #PB_Event_Gadget
             Select eventgadget () ; Gadgets
             
             EndSelect
     EndSelect
 
Until Event = #PB_Event_CloseWindow
KillTimer_ ( windowid (0), 1)
End
Et il y en a plein... D'autres ! Ce qui fait que aujourd'hui... j'arrête de prospecter... Il y a 866 page d'explication du manuel de PB et je n'en ai pas lu 200...
Mais j'ai au moins "déjà" plus de 300 modules exploitables, trucs etc... que j'ai vu et trouvé utiles...
Mais, je ne sais presque plus ou ils sont, malgré le fait de les avoir organisés...

Je commence à ne plus pouvoir écrire une ligne sans me demander si je n'ai pas quelque part une réponse à ma solution,
parce qu'il me semble l'avoir vu au lieu de réfléchir à mon problème... :?

Et un projet qui aurais déjà du être commencé il y a un ou deux mois, est toujours là, tellement je vais de découverte en découverte... au point d'en oublier le projet !
Si on regarde en plus Droopy, CodeArchive, Gnozal et d'autres Lib... qui sont des extensions... Alors on a plus que ce qu'il ne faut pour répondre à la majorité des problèmes que l'on a pour développer... Les APIs devraient rester les ultimes voies a suivre quand il n'y a pas de réponse PB.

Je deviens un boulimique de prospection du forum... :roll: Je suis passé de producteur à la catégorie des consommateur... :(

Le pire de l'histoire, c'est que l'on va chercher souvent midi à quatorze heure...
Il y a souvent des réponses PB comme le "AddKeyboardShortcut()" que l'on a remplacé par une API...

Il est évident que à la base... On peut remplacer presque toutes les fonctions PB par les API... plus de 7000 appels et si on ajoute leurs variantes selon les paramètres que l'on passe on multiple par deux ou trois en moyenne, ça fait un autre langage à lui seul... Et ce n'est plus du PureBasic !

Les échanges d'idées doivent continuer... Mais ce code que je passe ici, je l'ai en au moins trois versions... En réalité, beaucoup sont là ! existent, ont été publiée sous des formes différentes. Ce n'est que une forme de reproductions à cheval entre SDI et NetMaestro ...

Bon, de nouveau ce n'est qu'un avis... :lol: :lol: :lol:
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

à geBonet,
bon je vais regarder ton code, parce que le truc de KCC là ... c'est 8O arg mes pauvres petits neurones sont en surchauffes :lol: :lol: je piges à peu près le fonctionnement, y'a beaucoup de récusivité... houlàlà, je me vois pas rééimplémenter tout ça dans mon code.

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

Message par Patrick88 »

GeBonet a écrit : Il est évident que à la base... On peut remplacer presque toutes les fonctions PB par les API...

oui, mais c'est plus lourdingue, par exemple ce code de creation de gadgets qui utilisent les api et pas les habituels gadget...() de purebasic

Code : Tout sélectionner

Enumeration
  #fen0
  #gadget
  #img_fen0
  #listbox
  #text
  #button
  #panel
EndEnumeration

Procedure fen_0()
	OpenWindow(#fen0,100,0,800,600,"Capture",#PB_Window_SystemMenu)
	
	hfontlist.l = CreateWindow_("listbox",#Null,#WS_CHILD | #WS_VISIBLE | #LBS_STANDARD, 9, 30 , 200, 180, WindowID(#fen0),#listbox,#Null,#Null)
	hnumfont.l = CreateWindow_("static","text",#WS_CHILD | #WS_VISIBLE | #WS_BORDER, 9, 0 , 170, 20, WindowID(#fen0),#text,#Null,#Null)
	hbutton.l = CreateWindow_("button","ok",#WS_CHILD | #WS_VISIBLE | #WS_BORDER, 180, 0 , 30, 20, WindowID(#fen0),#button,#Null,#Null)
	hpanel.l = CreateWindow_(#WC_TABCONTROL, "",#WS_CHILD | #WS_CLIPSIBLINGS | #WS_VISIBLE, 220, 0, 200, 200, WindowID(#fen0),#panel,#Null,#Null)
     
	Repeat
		event = WaitWindowEvent()
		Select event
		  Case #PB_Event_CloseWindow
		    quit = 1
			Case #PB_Event_Gadget
				Select EventGadget()
					Case #button
						Debug "ok"
				EndSelect
				
		EndSelect
	Until quit = 1
EndProcedure

fen_0()
End
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

[corrigé] les gadgets se dessinent trop bas

sont gérée à ce stade, les gadgets de type :
comboboxgadget, textgadget, stringgadget, buttongadget...

par exemple ça "capture" bien le programme "captureGadget v2" mais seulement partiellement la fenetre message du debugger, il manque la listbox et la statusbar... "ça" crée des lignes vide dans le code généré :lol:

code supprimé = mis à jour en haut de la première page.

pat
Répondre