vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Verschiedenes / Sonstiges   |   VB-Versionen: VB4, VB5, VB618.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 OtterBewertung:     [ Jetzt bewerten ]Views:  33.068 
www.tools4vb.deSystem:  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.

Dieser Tipp wurde bereits 33.068 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!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.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel