VB 5/6-Tipp 0123: Alle Fensterhandle und Tasks ermitteln
von ActiveVB
Beschreibung
Von Zeit zu Zeit wird eine Möglichkeit benötigt, die Handles aller offenen Fenster zu enumerieren. Dieser Tipp zeigt, wie man neben der Handles auch den Titel des Fensters sowie die TaskID dazu ermitteln kann. Dabei wird zwischen sichtbaren, titellosen und anderen Fenstern unterschieden.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: GetDesktopWindow, GetParent, GetWindow, GetWindowLongA (GetWindowLong), GetWindowTextA (GetWindowText), GetWindowTextLengthA (GetWindowTextLength), GetWindowThreadProcessId | Download: |
'Dieser Quellcode stammt von http://www.activevb.de 'und kann frei verwendet werden. Für eventuelle Schäden 'wird nicht gehaftet. 'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. 'Ansonsten viel Spaß und Erfolg mit diesem Source! '------------- Anfang Projektdatei Project1.vbp ------------- '--------- Anfang Formular "Form1" alias Form1.frm --------- ' Steuerelement: Kontrollkästchen-Steuerelement "Check1" ' Steuerelement: Listen-Steuerelement "List1" (Index von 0 bis 2) ' Steuerelement: Optionsfeld-Steuerelement "Option2" ' Steuerelement: Optionsfeld-Steuerelement "Option1" ' Steuerelement: Schaltfläche "Command1" ' Steuerelement: Beschriftungsfeld "Label3" ' Steuerelement: Beschriftungsfeld "Label2" ' Steuerelement: Beschriftungsfeld "Label1" Option Explicit Private Declare Function GetDesktopWindow Lib "user32" () _ As Long Private Declare Function GetWindow Lib "user32" (ByVal hWnd _ As Long, ByVal wCmd As Long) As Long Private Declare Function GetWindowLong Lib "user32" Alias _ "GetWindowLongA" (ByVal hWnd As Long, ByVal wIndx As _ Long) As Long Private Declare Function GetWindowTextLength Lib "user32" _ Alias "GetWindowTextLengthA" (ByVal hWnd As Long) _ As Long Private Declare Function GetWindowText Lib "user32" Alias _ "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString _ As String, ByVal cch As Long) As Long Private Declare Function GetParent Lib "user32" (ByVal hWnd _ As Long) As Long Private Declare Function GetWindowThreadProcessId Lib "user32" _ (ByVal hWnd As Long, lpdwProcessId As Long) As Long Const GW_HWNDFIRST = 0 Const GW_HWNDLAST = 1 Const GW_HWNDNEXT = 2 Const GW_HWNDPREV = 3 Const GW_OWNER = 4 Const GW_CHILD = 5 Const GW_MAX = 5 Const GWL_STYLE = (-16) Const WS_VISIBLE = &H10000000 Const WS_BORDER = &H800000 Private Sub Check1_Click() Call EnumWindows End Sub Private Sub Form_Load() Call EnumWindows End Sub Private Sub Command1_Click() Call EnumWindows End Sub Private Sub List1_Click(Index As Integer) Static Flag, X% If Flag Then Exit Sub Flag = True For X = 0 To List1.UBound List1(X).ListIndex = List1(Index).ListIndex List1(X).TopIndex = List1(Index).TopIndex Next X Flag = False End Sub Private Sub EnumWindows() Dim hWnd& List1(0).Clear List1(1).Clear List1(2).Clear 'Auch der Desktop ist ein Fenster hWnd = GetDesktopWindow Call GetWindowInfo(hWnd) 'Einstieg hWnd = GetWindow(Me.hWnd, GW_HWNDFIRST) 'Alle vorhandenen Fenster abklappern Do Call GetWindowInfo(hWnd) hWnd = GetWindow(hWnd, GW_HWNDNEXT) Loop Until hWnd = 0 End Sub Private Sub GetWindowInfo(ByVal hWnd&) Dim Parent&, Task&, Result&, X&, Style&, Title$ 'Darstellung des Fensters Style = GetWindowLong(hWnd, GWL_STYLE) Style = Style And (WS_VISIBLE Or WS_BORDER) 'Title des Fenster auslesen Result = GetWindowTextLength(hWnd) + 1 Title = Space$(Result) Result = GetWindowText(hWnd, Title, Result) Title = Left$(Title, Len(Title) - 1) 'In Abhängigkeit der Optionen die Ausgabe erstellen If (Title <> "" Or (Check1.Value = vbChecked)) And _ (Style = (WS_VISIBLE Or WS_BORDER) Or Option2.Value) Then List1(0).AddItem CStr(hWnd) List1(1).AddItem Title 'Elternfenster ermitteln Parent = hWnd Do Parent = GetParent(Parent) Loop Until Parent = 0 'Task Id ermitteln Result = GetWindowThreadProcessId(hWnd, Task) List1(2).AddItem Task End If End Sub Private Sub Option1_Click() Call EnumWindows End Sub Private Sub Option2_Click() Call EnumWindows End Sub '---------- Ende Formular "Form1" alias Form1.frm ---------- '-------------- Ende Projektdatei Project1.vbp --------------
Tipp-Kompatibilität:
Windows/VB-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 16 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von Sergej am 09.06.2009 um 10:21
Guten Tag,
Ich habe diesen Quellcode ausprobiert und finde ihn genial, allerdings habe ich ein Problem.
Wenn ein Ordner/Verzeichnis als Task hiermit terminiert wird, wird koplett explorer beendet. Oder wenn man anschließend einen Zusatzcode zum starten des explorers nach Beendigung des Ordners aufruft, hängt sich die Anwendung auf.
Wäre es möglich den Quellcode so umzubauen das beim Terminieren eines Ordners der Explorer(Desktop) nicht mitbeendet wird?
Bitte um eine Rückantwort per EMail.
mfg Sergej
Kommentar von dobbe00g am 11.10.2006 um 00:22
Funktioniert super auch in VBA z.B. in Excel.
Änderungen - 'SUCHE'/'ERSETZE':
'Sub Form_Load()'/'Sub UserForm_Activate()'
'Steuerelement: Listen-Steuerelement "List1" (Index von 0 bis 2)'/''Steuerelement: Listen-Steuerelement "List1" .Columncount=3'
'List1(0).Clear: List1(1).Clear: List1(2).Clear'/'List1.Clear'
'List1(0).AddItem '/'List1.AddItem '
'List1(1).AddItem '/'List1.List(.ListCount - 1&, 1) = '
'List1(2).AddItem '/'List1.List(.ListCount - 1&, 2) = '
komplett auskommentiert:
'Private Sub List1_Click(Index As Integer)'...
Kommentar von Päuli am 15.04.2005 um 10:34
Einwandfrei. Besten Dank!
Kommentar von andi100test am 02.08.2004 um 16:27
Ich bin auf der Suche nach den Sourcecode für VB6 mit SP6, das es ermöglicht eine Funktion eines MDI Child Formulars zu unterbrechen, solange ein anderes MDI Child Formular sichbar ist. (vbModal = geht nicht).
Es währe nett, wenn jemand eine Lösung hätte.
Kommentar von Schattenkanzler am 30.12.2003 um 21:14
Also, mal an alle:
Man muss hier ein Steuerelementfeld erstellen, das aus drei ListBoxes besteht!
Also:
List1(0)
List1(1)
List1(2)
damit das Ganze klappt!
"Ungültige Verwendung des Schlüsselwortes "Me"":
Hast du den Code in einem Modul?
Falls ja: Ändere "Me" in den Namen der Form, die das
angesprochene Control beinhaltet!
Beispiel:
Me.List1(0).AddItem "Item"
wird zu:
Form1.List1(0).AddItem "Item"
Simpel, oder!?
Und für alle, die hier nach Makros fragen: Da seid ihr relativ falsch hier...sorry!
Kommentar von XFame am 05.05.2003 um 20:02
Schon gut hat sich seit Langem erledigt!!!
Kommentar von Arnie am 05.05.2003 um 17:15
Hallo miteinander,
das Proggi funktioniert unter Visual Studio einwandfrei, doch wenn ich es unter einem ACCESS Projekt verwenden will, klappert er nur die Fenster des aktiven Projektes, aber nicht alle ab. Wie kann ich dem entgegenwirken? Habe noch nicht wirklich viel mit API's gearbeitet.
MfG Arnie
Kommentar von XFame am 19.04.2003 um 21:54
hallo? bei mir kommt, wenn ich das programm starten will der fehler:
Deklaration der Prozedur entspricht nicht der Beschreibung eines Ereignesses oder einer Prozedur mit dem selben Namen.
Kommentar von epibem am 13.10.2002 um 11:17
@ Axel das Programm soll überhaupt keine Fenster schließen!!!
Kommentar von Heni am 02.09.2002 um 10:46
Hallo!
Auch ich bekomme immer eine Fehlermeldung mit:
Me.hWnd (Me = 'unzuläsige Verwendung des Schlüsselworts ME')
Leider weiss ich nicht woran es liegt... kann mir jemand behilflich sein. Danke im Vorraus...
Kommentar von Jan Böcker am 25.11.2001 um 14:40
Hallo Rudolf,
wenn du den Titel des Programms oder einen Teil davon kennst,´kannst du es mit AppActivate "Titel" in den Vordergrund rücken.
Kommentar von Andrzej Nieduzak am 17.10.2001 um 12:19
Hi,
Es funktioniert sehr gut - danke. Kann ich mit dem Tool auch versteckte Programme auflisten aber nur Hauptfenster. Ich kopple dieses Tool mit der Auflistung aller aktiven exe-Programme und über ProcessID hole aus diesem Tool die Beschreibungen dazu.
mfg
Andrzej
Kommentar von Nicolai K. am 20.07.2001 um 15:27
Lieber Rudolf,
das hier sind keine VB-Makros, sondern VB-Anwendungen für Visual Basic. Du benötigst also einen Visual Basic Compiler. Wenn du es trotzdem mit Makros versuchen möchtest, solltest du zunächst ein Listenfeld mit dem Namen List1 im Fenster erstellen.
Nicolai
Kommentar von thomas am 16.03.2001 um 18:33
wie kann ich aus der webbrowser komponente den markierten text ermitteln?
Kommentar von Axel Seeger am 27.02.2001 um 12:57
Habe den Tip unter VB4 und Win NT 4 ausprobiert.
Das Programm läuft zwar, aber die Fenster, die geschlossen werden sollen, bleiben offen :-(
Axel
Kommentar von Rudolf Lindner am 22.02.2001 um 08:42
Hallo,
habe gestern diese Seite gefunden und mich gefreut einige brauchbare Tips zu finden.
Doch leider stoße ich auf Fehlermeldungen in dem oben aufgeführten Makro.
Z.B. List1 (Variable nicht def.)
Me.hWnd (Me = 'unzuläsige Verwendung des Schlüsselworts ME')
Dieses Schlüsselwortbefindet sich auch in ihrem Makro 'Fenster in den Vordergrund bringen'
bei der Anweisung 'Me.Caption = ActivateWindow(xhWnd)'
Wäre Dankbar für ein luffähiges Makro oder ein Tip für folgendes Problem:
Ich möchte in einer Excel-Tabelle mit einer Schaltfläche per Makro das Programm WinpopUp.exe starten
,dies funktioniert auch, wenn es nicht bereits geöffnet ist.
Wie kann ich das Fenster des geöffneten Programms in den Vordergrund holen ?
MfG
Rudi