Rubrik: Oberfläche · Fenster | VB-Versionen: VB6 | 14.05.09 |
Fensterhandle anhand der Titelzeile ermitteln Mit dieser Funktion lässt sich das Handle eines Fenster anhand dessen (Teil-)Titelzeile ermitteln und auf Wunsch aktivieren. | ||
Autor: Dieter Otter | Bewertung: | Views: 31.677 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Wie lässt sich das Handle eines Fensters anhand dessen Fenstertitel ermitteln?
Die Antwort lautet: mit Hilfe der FindWindow API-Funktion.
Leider funktioniert das nur dann korrekt, wenn man den exakten Fenstertitel kennt, wobei sogar die Groß-/Kleinschreibung beachtet werden muss!
Was aber, wenn man bspw. nur den Anfang des Fenstertitels weiß?
In diesem Fall hilft uns ab sofort unsere neue Funktion FindWindowHandle weiter. Wir durchlaufen einfach alle Fenster und vergleichen deren Titelzeile via LIKE Operator mit der
gesuchten Titelzeile. Stimmt diese überein, wird das Fensterhandle als Funktionswert zurückgeliefert.
Kopieren Sie nachfolgenden Code in ein Modul:
Option Explicit ' benötigte API-Deklarationen Private Declare Function FindWindow Lib "user32" _ Alias "FindWindowA" ( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) 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 GetWindow Lib "user32" ( _ ByVal hwnd As Long, _ ByVal wCmd As Long) As Long Private Const GW_HWNDNEXT = 2
' Ermittelt das Handle eines Fensters anhand dessen Fenstertitel ' ' sTitel: muss nicht der exakte Fenstertitel sein ' hier kann bspw. auch nur der Anfang des Fenstertitel ' angegeben werden, z.B.: Fenstertitel* ' Public Function FindWindowHandle(ByVal sTitle As String) As Long Dim lngHWnd As Long Dim sText As String ' alle Fenster durchlaufen lngHWnd = FindWindow(vbNullString, vbNullString) Do While lngHWnd <> 0 ' Fensterttitel ermitteln sText = GetWindowTitle(lngHWnd) If Len(sText) > 0 And LCase$(sText) Like LCase$(sTitle) Then FindWindowHandle = lngHWnd: Exit Do End If ' Nächstes Fenster lngHWnd = GetWindow(lngHWnd, GW_HWNDNEXT) Loop End Function
' Hilfsfunktion zum Ermitteln des Fenstertitels Public Function GetWindowTitle(ByVal hwnd As Long) As String 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
Aufrufbeispiel:
Es wird nach dem Handle eines Fensters gesucht, dessen Titelzeile mit "MyApplication [" beginnt:
Dim hWnd As Long hWnd = FindWindowHandle("MyApplication [*") If hWnd <> 0 Then ...
Erweiterung:
Wird das gesuchte Fensterhandle gefunden, soll dieses autom. aktiviert und in den Vordergrund gebracht werden.
Fügen Sie hierzu noch folgende API-Funktion in das Modul ein:
Private Declare Function SetForegroundWindow Lib "user32" ( _ ByVal hwnd As Long) As Long
Und hier der Code:
Dim hWnd As Long ' Fensterhandle suchen hWnd = FindWindowHandle("Fenstertitel") If hWnd <> 0 Then ' Fenster aktivieren und in den Vordergrund holen SetForegroundWindow hWnd End If