Um zu prüfen, ob eine bestimmte Anwendung im Hintergrund ausgeführt wird bzw. aktiv ist, muss man alle aktiven Fenster ermitteln. Hierzu verwendet man am einfachsten die WinAPI-Funktion GetWindow in Verbindung mit den Konstanten GW_HWNDFIRST bzw. GW_HWNDNEXT. Innerhalb einer Do...Loop-Schleife ermittelt man solange das Handle des nächsten Fensters, bis man als Rückgabe den Wert 0 erhält. Dann gibt es keine weiteren Fenster mehr... ' zunächst die benötigten API-Deklarationen Private Declare Function GetWindow Lib "user32" ( _ ByVal hWnd As Long, _ ByVal wCmd As Long) As Long Const GW_HWNDFIRST = 0 Const GW_HWNDNEXT = 2 ' Handle aller geöffneten Fenster ermitteln Dim CurHwnd As Long ' Handle des ersten Fensters CurHwnd = GetWindow(hWnd, GW_HWNDFIRST) Do While CurHwnd <> 0 ' Handle des nächsten Fensters ' 0, wenn kein weiteres Fenster vorhanden CurHwnd = GetWindow(CurHwnd, GW_HWNDNEXT) Loop Wie Sie vielleicht wissen, lässt sich über das Fensterhandle auch der Titel des Fensters ermitteln. Hierzu verwendet man die API-Funktionen GetWindowText. Um nun zu prüfen, ob eine bestimmte Anwendung bereits ausgeführt wird, liegt es doch eigentlich nahe, einfach die Fenstertitel zu prüfen. Möchte man z.B. feststellen, ob der Microsot Internet Explorer geöffnet ist, so vergleicht man den ermittelten Fenstertitel mit dem Stringausdruck "Microsoft Internet Explorer". ' Prüfen, ob der Internet Explorer ausgeführt wird Dim Length As Long Dim sTitel As String CurHwnd = GetWindow(hWnd, GW_HWNDFIRST) Do While CurHwnd <> 0 ' Fenstertitel ermitteln sTitel = Space$(255) Length = GetWindowText(CurHwnd, sTitel, Len(sTitel)) sTitel = Left$(sTitel, Length) ' Fenstertitel prüfen If InStr(sTitel, "Microsoft Internet Explorer") > 0 Then MsgBox "Der Microsoft Internet Explorer wird ausgeführt!" Exit Do End If ' Handle des nächsten Fensters ' 0, wenn kein weiteres Fenster vorhanden CurHwnd = GetWindow(CurHwnd, GW_HWNDNEXT) Loop Eigentlich, so sollte man vermuten, sollte dieser Code immer funktionieren. Tut er auch - solange man den Titel des gesuchten Fensters kennt (oder zumindest einen eindeutigen Teil davon). Probieren Sie den obigen Code einmal aus, um zu prüfen, ob der Windows Explorer ausgeführt wird (also nicht der Internet Explorer). Klar - dann ersetzt man einfach den Ausdruck InStr(sTitel, "Microsoft Internet Explorer") durch InStr(sTitel, "Windows Explorer"), so sollte man jedenfalls zunächst meinen. Doch Vorsicht! Öffnen Sie einmal den Windows Explorer. In der Titelzeile wird nicht wie vielleicht vermutet der Begriff "Windows Explorer" angezeigt, sondern vielmehr das gerade im Exlorer-Fenster angezeigte Laufwerk bzw. Verzeichnis. Also scheidet die Möglichkeit der Prüfung anhand der Fenstertitels aus. Was nun? Wie kann man aber dennoch feststellen, ob jetzt z.B. der Windows Explorer ausgeführt wird oder nicht? Kurze Überlegung - dann die Lösung: Ja doch, anhand des Klassennamens! Der Windows-Explorer verfügt ebenso wie der Internet Explorer über einen eindeutigen Klassennamen. Im Falle des Windows-Explorers lautet dieser ExploreWClass. Um den Klassennamen eines durch das Fensterhandle bekannte Fenster zu ermitteln, steht uns die WinAPI-Funktion GetClassName zur Verfügung. ' weitere benötigte API-Deklarationen Private Declare Function GetClassName Lib "user32" _ Alias "GetClassNameA" ( _ ByVal hwnd As Long, _ ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long Dim lRetVal As Long Dim sClassName As String CurHwnd = GetWindow(hWnd, GW_HWNDFIRST) Do While CurHwnd <> 0 ' Klassennamen ermitteln sClassName = String$(256, " ") lRetVal = GetClassName(CurHwnd, sClassName, 255) sClassName = Left$(sClassName, InStr(sClassName, _ Chr$(0)) - 1) If sClassName = "ExploreWClass" Then ' Explorer-Fenster gefunden! MsgBox "Der Windows Explorer wird ausgeführt!" Exit Do End If ' Handle des nächsten Fensters ' 0, wenn kein weiteres Fenster vorhanden CurHwnd = GetWindow(CurHwnd, GW_HWNDNEXT) Loop Wie Sie gesehen haben, gibt es unterschiedliche Methoden und Wege, um zu prüfen, ob eine bestimmte Anwendung bereits ausgeführt wird. Für welche Methode Sie sich entscheiden, hängt demnach davon ab, ob die Anwendung anhand eines eindeutigen (Teil-)Titels "identifiziert" werden kann oder nicht. Dieser Tipp wurde bereits 33.068 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. |
sevAniGif (VB/VBA) Anzeigen von animierten GIF-Dateien Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. 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. |