ListOpenedWindows(hWnd,flags)
Übersicht

![]() |
Der EisvogelBetreff: ListOpenedWindows(hWnd,flags) |
![]() Antworten mit Zitat ![]() |
---|---|---|
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]) ![]() ![]() -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 ![]() -childs: Eine Bank, die mit den Handle's der Child-Types gefüllt ist. Muss mit PeekInt ![]() ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
-> Ich glaube du hast im decls immer noch vergessen alles in low zu ändern. Aber sobald das getan ist, funktioniert es bei mir bestens ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group