Rubrik: Verschiedenes / Sonstiges | VB-Versionen: VB4, VB5, VB6 | 18.07.01 |
Prüfen, ob eine Anwendung bereits ausgeführt wird Dieser Tipp prüft, ob eine bestimmte Anwendung bereits (im Hintergrund) ausgeführt wird. | ||
Autor: Dieter Otter | Bewertung: | Views: 33.127 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
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.