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
Olaf
Beiträge: 117
Registriert: 20.04.2006 14:51
Wohnort: 66606 St.Wendel (Niederlinxweiler, Dr.Albert-Schweitzer-Str.9)
Kontaktdaten:

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

Beitrag von Olaf »

Hab mal ne kleine Prozedur geschrieben, die die Titel, Fenster-Handles, Fensterklassen und PIDs der
zugehörigen Prozesse aller geöffneten Fenster auflistet.
Dies ist z.B. ganz nützlich, um herauszufinden, ob gewisse Fenster gerade geöffnet sind.
Denn mit dieser Prozedur ist es möglich, sofern das entsprechende Fenster geöffnet ist, dessen charakteristische Klasse und den Titel abzufragen.
Diese Werte können dann an anderer Stelle mit FindWindow_() benutzt werden, ob das Fenster gerade geöffnet ist oder nicht, um darauf (z.B. mit Schließen des Fensters) zu reagieren.

Code: Alles auswählen

Procedure EnumWindows(hWnd,ignore) ;Prozedur, die die Handles der Fenster erhält
	Visibility=ShowWindow_(hWnd,#SW_HIDE) ;Durch kurzzeitiges Verstecken herausfinden, ob die Fenster 
	If Visibility<>0 ;Wenn das Fenster sichtbar war...
		ShowWindow_(hWnd,#SW_SHOW) ;...wieder sichtbar machen
		title.s=Space(1024)
		class.s=Space(1024)
		PID.l=0
		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
	EndIf
	ProcedureReturn #True ;#True wird von der WinAPI als Rückgabewert benötigt
EndProcedure

EnumWindows_(@EnumWindows(),0) ;API, die die Handles von allen Fenstern an die Funktion EnumWindows() übergibt
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 »

Nette Idee, sehr schlechte Umsetzung, denn IsWindowVisible_() genügt, um herauszufinden, ob ein Fenster sichtbar ist.
Siehe hier: http://msdn2.microsoft.com/en-us/library/ms633530.aspx


Du widersprichst dich außerdem: Du sagst, du listest alle Fenster aus, letzten Endes debuggst du jedoch nur die, die auch sichtabr sind.


Habe deinen Code getestet, er funktioniert.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Alle offenen Fenster mit Titel, Handle, Klasse...auflist

Beitrag von edel »

AND51 hat geschrieben:Du widersprichst dich außerdem: Du sagst, du listest alle Fenster aus, letzten Endes debuggst du jedoch nur die, die auch sichtabr sind.
Olaf hat geschrieben:Hab mal ne kleine Prozedur geschrieben, die die Titel, Fenster-Handles, Fensterklassen und PIDs der
zugehörigen Prozesse aller geöffneten Fenster auflistet.
@AND51
Was hast du denn nicht verstanden ?
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 »

Hier mal sowas ähnliches für die Kinderchen :wink:

Code: Alles auswählen

Procedure EnumChildProc(hwnd.l, *lParam.long)
  Protected title.s{1024}
  Protected class.s{1024}
  *lParam\l + 1
  GetWindowText_(hWnd,@title,1024) ;Fenstertitel auslesen
  GetClassName_(hWnd,@class,1024)  ;Fensterklasse auslesen
  Debug "[Title]= " + title + " [hWnd]= " + Str(hWnd) + " [ClassName]= " + class;Werte ausgeben
  ProcedureReturn #True
EndProcedure

Procedure EnumChildWindows(hWnd.l, WindowTitel.s = "")
  If WindowTitel <> ""
    hWnd = FindWindow_(0, @WindowTitel)
  EndIf
  If hWnd = 0
    ProcedureReturn 0
  EndIf
  Protected Anzahl.l
  EnumChildWindows_(hWnd, @EnumChildProc(), @Anzahl)
  ProcedureReturn Anzahl
EndProcedure

Debug EnumChildWindows(0, "PureBasic")
Das Ergebnis ist die Anzahl der Childfenster
Parameter sind entweder hWnd oder Fenstertitel
PID hab ich mir gespart, ist immer dieselbe :mrgreen:

Gruß
Thomas
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 »

@ edel:
Auch die Taskleiste ist ein normales, geöffnetes Fenster, wird aber nicht debuggt.
Außerdem gibt es sooooo viele andere Fenster, die geöffnet sind, aber nicht debuggt werden (weil sie versteckt sind).

Die Aussage ist schlicht falsch.
Hast du das jetzt verstanden?

// Edit: Ein Fenster hat den Status "geöffnet", wenn es bereits existiert. Es ist egal, ob es versteckt, sichtbat, minimiert, maximiert oder außerhalb des Dekstops verschoben ist.
Mir fällt auch kein Ausnahmefall ein, wo diese Regel nicht zutrifft.

Schließlich kann man auch nur an geöffnete/existierende Fenster Daten Mittels SendMessage_() senden; bei "geschlossenen", also nicht mehr existierenden Fenstern ist das nicht möglich.
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 »

@AND51
lol
Er hat seine Procedure auf die sichtbaren und für den Programmierer am
häufigsten gebrauchten Fenster beschränkt, weil auf die anderen von Dir
erwähnten Fenstern kann ich z. B. keine Keyboardeingabe simulieren usw.

Der einzig sinnvolle Einwand von Dir, ist der mit IsWindowVisible_(), der Rest
ist Mumpitz und paßt nicht.

Beschränke Dich bitte auf Verbesserungsvorschläge und wähle den richtigen
Ton, ansonsten wird Recycled

In AND51 manier:
Hast du das jetzt verstanden?
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 »

@all: Naja...hab 'n bisschen geschlampt bei dem Code :oops: .
Ich glab in Zukunft schau ich mal lieber bei meinen Codes nach, ob auch alles so ist, wie's sein soll, bevor ich sie poste /:-> .
Naja...jetzt hab ich den Code mal so umgeschrieben, dass, so hoffe ich, alles was noch mangelhaft war, nun korrekt drinsteht.

Code: Alles auswählen

Procedure EnumChildWindows(hChild,Visibility)
  If IsWindowVisible_(hChild) Or Visibility=#False
    title.s{1024}
    GetWindowText_(hChild,@title,1024) ;Fenstertitel auslesen
    Debug " +[Title]= "+title+" [hChild]= "+Str(hChild) ;Werte ausgeben
  EndIf
  ProcedureReturn #True
EndProcedure

Procedure EnumWindows(hWnd,Visibility) ;Prozedur, die die Handles der Fenster erhält
  If IsWindowVisible_(hWnd) Or Visibility=#False
		title.s{1024}
		class.s{1024}
		PID.l=0
		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

EnumWindows_(@EnumWindows(),#True) ;#True, um nur sichtbare Fenster anzuzeigen; ansonsten #False
@mich selbst: erst denken, dann posten :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 »

Hauptsache jetzt ist der Code vernünftig :allright:

Kleiner Tip noch: Declariere bitte alle Variabeln, zumindest in diesem Forum
bei wiederverwendbarem Code.

Gruß
Thomas
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
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

Kann man auch Handle/Modul beenden?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
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 »

RSBasic hat geschrieben:Kann man auch Handle/Modul beenden?
Ich weiß nicht genau was Du meinst, aber anhand des Handles kannste versuchen das Fenster zu schliessen

Code: Alles auswählen

SendMessage_(hWnd, #WM_CLOSE, 0, 0)
Ich hoffe die Para sind so richtig, nicht getestet. Oder anhand der Pid
abschiessen, dafür kannste die Processlib in PBOSL nutzen.
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
Antworten