Welche Anwendungen sind alles gestartet? Wie lauten die dazugehörigen TaskIDs bzw. Fenster-Handles? Welcher Text steht in den Titelzeilen? All diese Fragen beantwortet unser heutiger Tipp. Alles, was Sie zum Ausprobieren benötigen, ist eine Form, ein ListView-Control, ein CommandButton und ein Modul. Beim Klicken auf den CommandButton wird die Windows Fensterliste durchlaufen und alle gefundenen Programme im ListView sauber angezeigt, natürlich mit Fenstertitel, TaskID und Fenster-Handle. ' Fensterliste ermitteln und anzeigen Private Sub Command1_Click() GetWindowList ListView End Sub Sollen alle Fenster ermittelt werden, also auch diejenigen, die nicht direkt sichtbar sind, einfach im GetWindowList-Aufruf als zweiten Parameter False angeben. Folgenden Code bitte in das Modul einfügen: Option Explicit ' alle benötigten API's 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 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 Public Function GetWindowList(oLSV As ListView, _ Optional bVisible As Boolean = True) ' oLSV - Ein beliebiges ListView, das die ' Informationen aufnehmen soll ' bVisible - Wenn True werden nur sichtbare Windows ' angezeigt, ansonsten alles Dim hWnd As Long Dim sTitle As String Dim lTaskID As Long Dim lStyle As Long Dim oListItem As ListItem ' ListView-Spalten festlegen With oLSV.ColumnHeaders .Clear .Add , "hWnd", "hWnd" .Add , "TaskID", "TaskID" .Add , "Visible", "Visible" .Add , "Title", "Title" End With ' Inhalt löschen und umschalten auf "Detail"-Ansicht oLSV.ListItems.Clear oLSV.View = lvwReport ' Erstes WindowHandle holen hWnd = GetWindow(oLSV.Parent.hWnd, GW_HWNDFIRST) Do ' Handle auswerten und im ListView eintragen lStyle = GetWindowLong(hWnd, GWL_STYLE) lStyle = lStyle And (WS_VISIBLE Or WS_BORDER) sTitle = GetWindowTitle(hWnd) lTaskID = GetWindowTaskID(hWnd) If (lStyle = (WS_VISIBLE Or WS_BORDER)) = bVisible Then ' in das ListView eintragen Set oListItem = oLSV.ListItems.Add(, , hWnd) With oListItem .SubItems(1) = lTaskID .SubItems(2) = lStyle = (WS_VISIBLE Or WS_BORDER) .SubItems(3) = sTitle End With End If ' Nächses Handle hWnd = GetWindow(hWnd, GW_HWNDNEXT) Loop Until hWnd = 0 End Function Private Function GetWindowTaskID(ByVal hWnd As Long) _ As Long ' Ermittelt die TaskID eines Windows anhand des ' Window Handle Dim lResult As Long Dim lTemp As Long lResult = GetWindowThreadProcessId(hWnd, lTemp) GetWindowTaskID = lTemp End Function Private Function GetWindowTitle(ByVal hWnd As Long) _ As String ' Ermittelt den Namen eines Windows anhand des ' Window Handle Dim lResult As Long Dim sTemp As String lResult = GetWindowTextLength(hWnd) + 1 sTemp = Space(lResult) lResult = GetWindowText(hWnd, sTemp, lResult) GetWindowTitle = Left(sTemp, Len(sTemp) - 1) End Function Und wenn Sie nun lediglich prüfen wollen, ob z.B. WinWord gestartet ist, können Sie dies folgendermassen tun: Public Function WordIsRunning(oForm As Form) As Boolean ' Gibt True zurück, wenn Word geladen ist Dim hWnd As Long Dim sTitle As String Dim lStyle As Long WordIsRunning = False ' Ich alter Pessimist ;-) ' Erstes WindowHandle holen hWnd = GetWindow(oForm.hWnd, GW_HWNDFIRST) Do ' Handle auswerten lStyle = GetWindowLong(hWnd, GWL_STYLE) lStyle = lStyle And (WS_VISIBLE Or WS_BORDER) If (lStyle = (WS_VISIBLE Or WS_BORDER)) = True Then ' Titelzeile ermitteln und prüfen, ob ' das "Microsoft Word" darin enthalten ist sTitle = GetWindowTitle(hWnd) If InStr(1, sTitle, "Microsoft Word", _ vbTextCompare) > 0 Then WordIsRunning = True Exit Do End If End If ' Nächses Handle hWnd = GetWindow(hWnd, GW_HWNDNEXT) Loop Until hWnd = 0 End Function Dieser Tipp wurde bereits 83.894 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
Neu! sevPopUp 2.0 Dynamische Kontextmenüs! Erstellen Sie mit nur wenigen Zeilen Code Kontextmenüs dynamisch zur Laufzeit. Vordefinierte Styles (XP, Office, OfficeXP, Vista oder Windows 8) erleichtern die Anpassung an die eigenen Anwendung... Tipp des Monats März 2024 Dieter Otter UTF-8 Konvertierung von Dateien und Strings VB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. Access-Tools Vol.1 Über 400 MByte Inhalt Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |