Seite 2 von 3
Verfasst: 22.03.2007 19:19
von AND51
AND51 hat geschrieben:Hast du das jetzt verstanden?
Das ist das Einzige, wofür ich mich threadweit entschuldigen müsste. Tu ich aber nicht, da du ich und edel jetzt damit quitt sind (du als MOD bist Vorbild!)
> ansonsten wird Recycled
Nett, dass ich mich nicht mehr selbst drum kümmern muss, wenn mal was daneben geht.
@ Olaf: Sehr, sehr schöne Idee, ich muss dich loben! Die Idee mit dem Visibility-Flag ist geradezu brilliant!
Hätte noch einen Tipp für dich: Mach das visibility-Flag doch optional, dann ist's noch komfortabler:
> Procedure EnumWindows(hWnd,Visibility=#True)
Jetzt noch, wie TS-Soft sagte, die Variablen korrekt deefinieren (siehe
EnableExplicit), dann ist's top!
Verfasst: 23.03.2007 12:39
von Olaf
So...jetzt nochmal der Code, nun aber mit allen Vorschlägen:
-korrekt deklariert
-optionaler Flag
Code: Alles auswählen
EnableExplicit
Procedure EnumChildWindows(hChild,Visibility)
Protected title.s{1024}
If IsWindowVisible_(hChild) Or Visibility=#False
GetWindowText_(hChild,@title,1024) ;Fenstertitel auslesen
Debug " +[Title]= "+title+" [hChild]= "+Str(hChild) ;Werte ausgeben
EndIf
ProcedureReturn #True
EndProcedure
Procedure EnumWindows(hWnd,Visibility=#True) ;Prozedur, die die Handles der Fenster erhält
Protected title.s{1024},class.s{1024},PID.l=0
If IsWindowVisible_(hWnd) Or Visibility=#False
GetWindowText_(hWnd,@title,1024) ;Fenstertitel auslesen
GetClassName_(hWnd,@class,1024) ;Fensterklasse auslesen
GetWindowThreadProcessId_(hWnd,@PID) ;PID des zugehörigen Prozesses auslesen
Debug "[Title]= "+title+" [hWnd]= "+Str(hWnd)+" [ClassName]= "+class+" [PID]= "+Str(PID) ;Werte ausgeben
EnumChildWindows_(hWnd,@EnumChildWindows(),Visibility) ;ChildWindows auflisten
EndIf
ProcedureReturn #True
EndProcedure
;Beispiel zum Anzeigen aller (hier: sichtbaren) Fenster:
EnumWindows_(@EnumWindows(),#True) ;#True, um nur sichtbare Fenster anzuzeigen; ansonsten #False
;Beispiel zum Anzeigen aller ChildWindows eines Fensters:
Define.s Klasse,Name
EnumWindows(FindWindow_(Klasse,Name)) ;Flag wird nicht benötigt (default=#True)
P.S.: Jetzt dürfte eigentlich nix mehr fehlen.

Verfasst: 23.03.2007 14:12
von AND51
Vielleicht habe ich ja jetzt ein Brett vor'm Kopf, aber warum benutzt du Static-Variablen?
Muss das nicht Protected sein
Ansonsten: Sehr gut!

Verfasst: 23.03.2007 14:25
von Olaf
@AND51: Natürlich muss es "Protected" sein
->verbessert
Danke, dass du mich drauf aufmerksam gemacht hast.

Verfasst: 23.03.2007 14:41
von ts-soft
Wenn er in EnumChildWindows Static nimmt wirds aber schneller!
Jedoch der Speicherverbrauch ist grösser (so wie bei einer globalen Variable)
Ich dachte der AND51 ist immer so Speed-Erpicht

Verfasst: 23.03.2007 15:03
von AND51
@ Olaf: Bitte!
@ TS-Soft: Das stimmt, Speed+Speicher...
Mein GEdankengang war jedoch, dass Speicher "gespart" wird, wenn man lieber Protected benutzt. Ich denke, dass es schneller geht als mit Static, weil der Speicher nicht
überschrieben werden muss, sondern völlig neu belegt werden kann.
Aber da ich heute nicht ganz auf der Höhe bin, kann es sein, dass ich das nicht ganz verstanden habe.
Wieso ist das denn mit Static schneller, TS-Soft?
Verfasst: 23.03.2007 15:15
von ts-soft
>> Wieso ist das denn mit Static schneller, TS-Soft?
Weil nicht jedesmal bei Aufruf der Procedure der Speicher erneut reserviert
werden muß! Bei dem EnumerationsCallback wäre Static evtl. Vorteilhaft!
Wurde auch schon mit Speed-Tests belegt. Das soll aber nicht heissen, das
man unsinnigerweise jetzt immer Static verwendet, weil Speedoptimierung,
sowie Speicheroptimierung sind nur in den seltensten Fällen (jedenfalls bei
Anwendungen) erforderlich. Meist bringst nur wenige millisekunden, die
keiner bemerkt, bzw. die gar keine Auswirkung haben, Aufgrund des
EventLoops.
Ich finde den Code mit Protected natürlich schöner, wollte es nur anmerken.
Verfasst: 23.03.2007 15:44
von Olaf
So. Jetzt kann jeder von euch machen, was er will:
Code: Alles auswählen
EnableExplicit
#Static=0
#Protected=1
#Typ=#Protected ;Or #Static
CompilerIf #Typ=#Static
Procedure EnumChildWindows(hChild,Visibility)
Static title.s{1024}
If IsWindowVisible_(hChild) Or Visibility=#False
GetWindowText_(hChild,@title,1024) ;Fenstertitel auslesen
Debug " +[Title]= "+title+" [hChild]= "+Str(hChild) ;Werte ausgeben
EndIf
ProcedureReturn #True
EndProcedure
Procedure EnumWindows(hWnd,Visibility=#True) ;Prozedur, die die Handles der Fenster erhält
Static title.s{1024},class.s{1024},PID.l=0
If IsWindowVisible_(hWnd) Or Visibility=#False
GetWindowText_(hWnd,@title,1024) ;Fenstertitel auslesen
GetClassName_(hWnd,@class,1024) ;Fensterklasse auslesen
GetWindowThreadProcessId_(hWnd,@PID) ;PID des zugehörigen Prozesses auslesen
Debug "[Title]= "+title+" [hWnd]= "+Str(hWnd)+" [ClassName]= "+class+" [PID]= "+Str(PID) ;Werte ausgeben
EnumChildWindows_(hWnd,@EnumChildWindows(),Visibility) ;ChildWindows auflisten
EndIf
ProcedureReturn #True
EndProcedure
CompilerElse
Procedure EnumChildWindows(hChild,Visibility)
Protected title.s{1024}
If IsWindowVisible_(hChild) Or Visibility=#False
GetWindowText_(hChild,@title,1024) ;Fenstertitel auslesen
Debug " +[Title]= "+title+" [hChild]= "+Str(hChild) ;Werte ausgeben
EndIf
ProcedureReturn #True
EndProcedure
Procedure EnumWindows(hWnd,Visibility=#True) ;Prozedur, die die Handles der Fenster erhält
Protected title.s{1024},class.s{1024},PID.l=0
If IsWindowVisible_(hWnd) Or Visibility=#False
GetWindowText_(hWnd,@title,1024) ;Fenstertitel auslesen
GetClassName_(hWnd,@class,1024) ;Fensterklasse auslesen
GetWindowThreadProcessId_(hWnd,@PID) ;PID des zugehörigen Prozesses auslesen
Debug "[Title]= "+title+" [hWnd]= "+Str(hWnd)+" [ClassName]= "+class+" [PID]= "+Str(PID) ;Werte ausgeben
EnumChildWindows_(hWnd,@EnumChildWindows(),Visibility) ;ChildWindows auflisten
EndIf
ProcedureReturn #True
EndProcedure
CompilerEndIf
;Beispiel zum Anzeigen aller (hier: sichtbaren) Fenster:
EnumWindows_(@EnumWindows(),#True) ;#True, um nur sichtbare Fenster anzuzeigen; ansonsten #False
;Beispiel zum Anzeigen aller ChildWindows eines Fensters:
Define.s Klasse,Name
EnumWindows(FindWindow_(Klasse,Name)) ;Flag wird nicht benötigt (default=#True)

Verfasst: 23.03.2007 15:53
von ts-soft
Frage: Warum haste EnumChildWindows Neu gemacht, hatte ich doch bereits
gepostet. Bzw. die Sichtbarkeit eines ChildFensters spielt doch
normallerweise gar keine Rolle im Gegensatz zu EnumWindows
Verfasst: 23.03.2007 16:35
von Olaf
@ts-soft: Hab ich bei EnumChildWindows was neu gemacht??? Also ich glaub nicht.
Der Post bezieht sich ja nur auf den Static-Protected-Konflikt
(Ich würd den Code so nie verwenden -> Protected

)