Seite 1 von 3

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

Verfasst: 21.03.2007 21:45
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

Verfasst: 22.03.2007 01:38
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.

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

Verfasst: 22.03.2007 01:56
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 ?

Verfasst: 22.03.2007 02:35
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

Verfasst: 22.03.2007 13:53
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.

Verfasst: 22.03.2007 15:27
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?

Verfasst: 22.03.2007 15:33
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:

Verfasst: 22.03.2007 15:58
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

Verfasst: 22.03.2007 16:01
von RSBasic
Kann man auch Handle/Modul beenden?

Verfasst: 22.03.2007 16:10
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.