Alle offenen Fenster mit Titel, Handle, Klasse...auflisten

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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. :allright:


@ Olaf: Sehr, sehr schöne Idee, ich muss dich loben! Die Idee mit dem Visibility-Flag ist geradezu brilliant! :allright: :allright:
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!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Olaf
Beiträge: 117
Registriert: 20.04.2006 14:51
Wohnort: 66606 St.Wendel (Niederlinxweiler, Dr.Albert-Schweitzer-Str.9)
Kontaktdaten:

Beitrag 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. :wink:
Zuletzt geändert von Olaf am 23.03.2007 14:23, insgesamt 1-mal geändert.
PB 4.xx (Windows & Linux & Mac OS X)
Treffen sich 2 Kurven in der Unendlichkeit. Sagt die eine zur anderen: "Hau ab aus meinem Definitionsbereich oder ich leite dich ab!"
Darauf die andere: "Mach nur! Ich bin die e-Funktion." :lol:
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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! :allright:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Olaf
Beiträge: 117
Registriert: 20.04.2006 14:51
Wohnort: 66606 St.Wendel (Niederlinxweiler, Dr.Albert-Schweitzer-Str.9)
Kontaktdaten:

Beitrag von Olaf »

@AND51: Natürlich muss es "Protected" sein ->verbessert
Danke, dass du mich drauf aufmerksam gemacht hast. :allright:
PB 4.xx (Windows & Linux & Mac OS X)
Treffen sich 2 Kurven in der Unendlichkeit. Sagt die eine zur anderen: "Hau ab aus meinem Definitionsbereich oder ich leite dich ab!"
Darauf die andere: "Mach nur! Ich bin die e-Funktion." :lol:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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 :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Olaf
Beiträge: 117
Registriert: 20.04.2006 14:51
Wohnort: 66606 St.Wendel (Niederlinxweiler, Dr.Albert-Schweitzer-Str.9)
Kontaktdaten:

Beitrag 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)
:lol:
PB 4.xx (Windows & Linux & Mac OS X)
Treffen sich 2 Kurven in der Unendlichkeit. Sagt die eine zur anderen: "Hau ab aus meinem Definitionsbereich oder ich leite dich ab!"
Darauf die andere: "Mach nur! Ich bin die e-Funktion." :lol:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Olaf
Beiträge: 117
Registriert: 20.04.2006 14:51
Wohnort: 66606 St.Wendel (Niederlinxweiler, Dr.Albert-Schweitzer-Str.9)
Kontaktdaten:

Beitrag 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 :lol:
(Ich würd den Code so nie verwenden -> Protected :lol: )
PB 4.xx (Windows & Linux & Mac OS X)
Treffen sich 2 Kurven in der Unendlichkeit. Sagt die eine zur anderen: "Hau ab aus meinem Definitionsbereich oder ich leite dich ab!"
Darauf die andere: "Mach nur! Ich bin die e-Funktion." :lol:
Antworten