ListOpenedWindows(hWnd,flags)

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Der Eisvogel

Betreff: ListOpenedWindows(hWnd,flags)

BeitragMo, Mai 25, 2009 12:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Ich möchte euch jetzt meine Funktion ListOpenedWindows vorstellen die ich mit euer Hilfe erstellen konnte.
Die Funktion stellt einen Ersatz für EnumWindows, was man leider nicht mit Blitz verwenden kann, dar.
Sie bietet auch einige Zusatz-Features.

Also erstmal die Doku:

Funktion: ListOpenedWindows(hWnd[,flags])
Arrow hWnd: Hier muss ein Fenster-Handle angegeben werden, mit dem die Auflistung beginnen soll
Arrow flags(optional): Hier werden Flags angegeben:
-LOP_ALL(Standard): Es werden Fenster aufgelistet, die auf der selben Ebene von hWnd liegen, und auch darunterliegende
-LOP_CHILD: Es werden nur Child-Fenster von hWnd aufgelistet
-LOP_TITLE(Standard): Fenstertitle werden ausgelesen
-LOP_CLASS(Standard): Fensterklassen werden ausgelesen
-LOP_PROC: Prozess-Handles und Prozess-ID's werden ausgelesen
-LOP_STRUCTURE: Parents und Childs werden gespeichert.

WICHTIG: LOP_ALL darf nicht mit LOP_CHILD verwendet werden!

Alle gefundenen Fenster werden im Type OpenedWindows gespeichert.
Aufbau des Types:
-hWnd: Fensters-Handle
-title: Fenstertitle
-class: Fensterklasse
-hProc: Prozess-Handle
-Proc_ID: Prozess-ID
-parent: Handle des Parent-Types. Muss mit Object umgeformt werden
-childs: Eine Bank, die mit den Handle's der Child-Types gefüllt ist. Muss mit PeekInt ausgelesen werden und mit Object umgeformt werden.

Bei jedem Funktions-Aufruf wird der Type gelöscht.

Hier der Code der Funktion:
ListOpenedWindows(hWnd,flags).bb - Code: [AUSKLAPPEN]
;GetWindow - Konstanten (GW)
Const GW_HWNDFIRST=0
Const GW_HWNDLAST=1
Const GW_HWNDNEXT=2
Const GW_HWNDPREV=3
Const GW_OWNER=4
Const GW_CHILD=5
;/GetWindow - Konstanten

;ListOpendeWindows - Konstanten (LOP)
Const LOW_ALL=1
Const LOW_CHILDS=2
Const LOW_TITLE=4
Const LOW_CLASS=8
Const LOW_PROC=16
Const LOW_STRUCTURE=32
;/ListOpendeWindows - Konstanten

Global tmp_title_buffer
Global tmp_class_buffer
Global tmp_proc_id


Type openedwindow
   Field hWnd
   Field title$
   Field class$
   Field hProc
   Field Proc_ID
   Field parent
   Field childs
End Type
Global ownd.openedwindow



Function ListOpenedWindows(tmp_hWnd=0,tmp_flags=LOW_ALL Or LOW_TITLE Or LOW_CLASS)
   If (tmp_flags And LOW_ALL) And (tmp_flags And LOW_CHILDS) Then RuntimeError("Cant't mix LOW_ALL and LOW_CHILDS")
   If tmp_hWnd=0 Then tmp_hWnd=low_GetWindow(low_GetDesktopWindow(),GW_CHILD)
   
   For ownd=Each openedwindow
      Delete ownd
   Next
   
   tmp_title_buffer=CreateBank(0) ;Bank für den Fenstertitel erstellen
   tmp_class_buffer=CreateBank(256) ;Bank für die Fensterklasse erstellen
   tmp_proc_id=CreateBank(4) ;Bank für die Prozess-ID erstellen
   ListOpenedWindowsEx(tmp_hWnd,tmp_flags,Null)
   FreeBank tmp_title_buffer ;Bank für den Fenstertitel löschen
   FreeBank tmp_class_buffer ;Bank für die Fensterklasse löschen
   FreeBank tmp_proc_id ;Bank für die Prozess-ID löschen
End Function



Function ListOpenedWindowsEx(tmp_hWnd,tmp_flags,tmp_parent.openedwindow)
   If tmp_flags And LOW_ALL Then tmp_hWnd=low_GetWindow(tmp_hWnd,GW_HWNDFIRST)
   If tmp_flags And LOW_CHILDS Then tmp_hWnd=low_GetWindow(tmp_hWnd,GW_CHILD) : tmp_flags=tmp_flags-LOW_CHILDS+LOW_ALL
   
   While tmp_hWnd<>0
      ownd=New openedwindow
      ownd\hWnd=tmp_hWnd
      
      If tmp_flags And LOW_TITLE Then
         tmp_title_length=low_GetWindowTextLength(tmp_hWnd)+1 ;Fenstertitellänge ermitteln
         ResizeBank(tmp_title_buffer,tmp_title_length)
         low_GetWindowText(tmp_hWnd,tmp_title_buffer,tmp_title_length) ;Fenstertitel ermitteln
         tmp_title$=PeekString(tmp_title_buffer,0) ;Fenstertitel speichern
         ownd\title=tmp_title
      EndIf
      
      If tmp_flags And LOW_CLASS Then
         low_GetClassName(tmp_hWnd,tmp_class_buffer,256) ;Fensterklasse ermitteln
         tmp_class$=PeekString(tmp_class_buffer,0) ;Fensterklasse speichern
         ownd\class=tmp_class
      EndIf
      
      If tmp_flags And LOW_PROC Then
         low_GetWindowThreadProcessId(tmp_hWnd,tmp_proc_id) ;Prozess-ID ermitteln
         tmp_ProcID=PeekInt(tmp_proc_id,0)
         tmp_hProc=low_OpenProcess($F0000 Or $100000 Or $FFF,False,tmp_ProcID) ;Handle des Prozess' ermitteln
         ownd\hProc=tmp_hProc
         ownd\Proc_ID=tmp_Proc_ID
      EndIf
      
      
      If tmp_flags And LOW_STRUCTURE Then
         If tmp_parent<>Null Then
            ResizeBank(tmp_parent\childs,BankSize(tmp_parent\childs)+4)
            PokeInt(tmp_parent\childs,BankSize(tmp_parent\childs)-4,Handle(ownd))
         EndIf
         ownd\parent=Handle(tmp_parent)
         ownd\childs=CreateBank(0)
      EndIf
      
      tmp2_hWnd=low_GetWindow(tmp_hWnd,GW_CHILD)
      If tmp2_hWnd<>0 Then ListOpenedWindowsEx(tmp2_hWnd,tmp_flags,ownd)
      tmp_hWnd=low_GetWindow(tmp_hWnd,GW_HWNDNEXT)
   Wend
End Function



Function PeekString$(tmp_buffer,tmp_pos)
   For i=0 To BankSize(tmp_buffer)-1
      byte=PeekByte(tmp_buffer,tmp_pos)
      If byte<>0
         ret$=ret$+Chr(byte)
      Else
         Return ret$
      EndIf
      tmp_pos=tmp_pos+1
   Next
   RuntimeError "String terminator not found."
End Function


Jetzt die Userlib:
ListOpenedWindows.decls - Code: [AUSKLAPPEN]
.lib "user32.dll"
low_FindWindowEx%(hWnd%,hWndChild%,lpszClassname$,lpszWindow$) : "FindWindowExA"

low_GetDesktopWindow%() : "GetDesktopWindow"
low_GetWindow%(hWnd%,wCmd%) : "GetWindow"

low_GetWindowText%(hWnd%,lpString*,cch%) : "GetWindowTextA"
low_GetWindowTextLength%(hWnd%) : "GetWindowTextLengthA"
low_GetClassName%(hWnd%,lpClassName*,nMaxCount%) : "GetClassNameA"

low_GetWindowThreadProcessId%(hWnd,lpdwProcessId*) : "GetWindowThreadProcessId"


.lib "kernel32.dll"
low_OpenProcess%(dwDesiredAccess%,bInheritHandle%,dwProcessId%) : "OpenProcess"


.lib " "
ListOpenedWindows(hWnd%,flags%)


Und zum Schluss noch ein Beispiel, welches die Taskleiste auflistet:
Sample.bb - Code: [AUSKLAPPEN]
Include "ListOpenedWindows(hWnd,flags).bb"

hTask=low_FindWindowEx(0,0,"Shell_TrayWnd","")
ListOpenedWindows(hTask,LOW_CHILDS Or LOW_TITLE Or LOW_CLASS Or LOW_PROC Or LOW_STRUCTURE)

For ownd=Each openedwindow
   number=number+1
   DebugLog "hWnd: "+ownd\hWnd
   DebugLog "Titel: "+ownd\title
   DebugLog "Klasse: "+ownd\class
   DebugLog "hProc: "+ownd\hProc
   DebugLog "Proc-ID: "+ownd\Proc_ID
   DebugLog "Parent: "+ownd\parent
   For i=0 To BankSize(ownd\childs)/4-1
      DebugLog "Child: "+PeekInt(ownd\childs,i*4)
   Next
   DebugLog ""
Next

DebugLog "Ihre Taskleiste besteht aus "+number+" Fenstern und Childs"

WaitKey
End


Meine Taskleiste hat 12 Fenster bzw Childs.


Achtung!!!
1. Ich hatt noch einen Fehler drin, der einen RuntimeError bei der Titel-Ermittlung auslösen konnte, dieser ist nun beseitigt.
2. Ich hatte im Samle der Taskleiste einen Schreibfehler. Kein Wunder, dass ich so viele Fenster hatte.


Viel Spaß damit.

MfG
Der Eisvogel
  • Zuletzt bearbeitet von Der Eisvogel am Do, Jul 02, 2009 21:40, insgesamt 2-mal bearbeitet
 

judos

BeitragSa, Jun 27, 2009 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
hey!

Ich habs mal ausprobiert aber scheint nicht zu funktionieren...
Zudem hatte es noch viele Fehler, also musste überall lop_ statt low_ hinschreiben, damit ich es überhaupt starten kann.
Jetzt ist allerdings das Problem, dass bbBank does not exists als Fehler ausgegeben wird.

mfg judos

BtbN

BeitragSo, Jun 28, 2009 0:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Juhu, mal wieder eine BMax-Funktion, die nur unter Windows funktioniert. Einige ham wohl noch nicht so ganz begriffen, wass BMax auch wo anders funktionieren soll.

Edit: *vergessts*
  • Zuletzt bearbeitet von BtbN am So, Jun 28, 2009 0:47, insgesamt einmal bearbeitet

DAK

BeitragSo, Jun 28, 2009 0:40
Antworten mit Zitat
Benutzer-Profile anzeigen
juhu, wieder mal jemand, der nicht lesen kann und deswegen versucht bb-code unter bmax zum laufen zu kriegen und sich dann beschwert, dass es nicht funktioniert... einige haben wohl noch nicht so ganz begriffen, wass blitzbasic nur im blitzbasic-compiler rennt und nur für windows compilieren kann...
Gewinner der 6. und der 68. BlitzCodeCompo

BtbN

BeitragSo, Jun 28, 2009 0:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, sorry, war sicher, ich wäre im BMax Bereich.

Und du hast trotzdem nicht ganz begriffen, worauf ich hinaus wollte. Kommt leider immer wieder vor, dass in BMax Win-Only Lösungen gebaut werden, und somit die Portablität von BMax ad absurdum geführt wird.
Versucht, diesen Code ans laufen zu bekommen, habe ich garnicht erst.

Der Eisvogel

BeitragSo, Jun 28, 2009 11:51
Antworten mit Zitat
Benutzer-Profile anzeigen
@judos: Ich habe die Schreibfehler korrigegiert. Tut mir echt leid. Ich weiß nicht wieso ich das gemacht habe. Jetzt sollte es eigentlich wieder funktionieren.

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
 

judos

BeitragMi, Jul 01, 2009 12:05
Antworten mit Zitat
Benutzer-Profile anzeigen
-> Ich glaube du hast im decls immer noch vergessen alles in low zu ändern. Aber sobald das getan ist, funktioniert es bei mir bestens Smile
Bin mir nur noch nicht ganz sicher, welche Sachen von meiner Taskliste ausgegeben werden. Sind das alle TaskIcons rechts unten bei der Uhr + vielleicht QuickStart Icons ? Aber die Fenster die offen sind, werden die auch aufgelistet?

mfg judos

Geeecko

BeitragDo, Jul 02, 2009 13:09
Antworten mit Zitat
Benutzer-Profile anzeigen
lol @ BtbN...
Ich war mir auch sicher im BMax Bereich gewesen zu sein und wollte so ziehmlich genua das selbe schreiben wie du :>
....

Der Eisvogel

BeitragDo, Jul 02, 2009 21:46
Antworten mit Zitat
Benutzer-Profile anzeigen
@judos: Danke, ich hab jetzt hoffe ich alles geändert. Zu deiner Frage: Das Besspiel oben listet nur die einzelnen Handle auf, die deine Taskleiste hat. Da wäre der Start-Button oder die Traybar, diese sind jeweils ein Handle. Wenn du alles haben willst, dann musst du bei hWnd einfach 0 angeben, dann wird vom Dektop an alles aufgelistet. Da sind dann alle Fenster dabei. Wenn du alle die Fenster/Handles haben willst, dann musst du bei den Flags LOW_CHILDS mit angeben.

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group