Tipp 0392 Fenster-Handle ermitteln (ohne exakten Titel)
Autor/Einsender:
Datum:
  Angie
11.04.2004
Entwicklungsumgebung:   VB 6
Mit der API-Funktion FindWindow kann das Fenster-Handle eines Stammfensters (Top Level), das durch den Fenster-Titel und/oder den Klassennamen spezifiziert wurde, ermittelt werden. In diesem Fall muss allerdings nach dem exakten Fenster-Titel/-Text gesucht werden.
Dieser Tipp zeigt wie das Handle eines Fensters ermittelt werden kann, ohne den exakten Titel zu kennen. Als Suchkriterium kann hier ein Teil des Fenster-Titels/-Textes (Wildcards) und/oder der Klassenname vorgegeben werden.
In diesem Beispiel wird auch gezeigt, wie ein ausgewähltes Stammfenster in den Vordergrund gebracht werden kann.
Code im Modul modFindWindowLike
In der Funktion FindWindowLike in diesem Modul werden die Fenster-Handle der Fenster ermittelt, die mit dem Suchkriterium übereinstimmen.
Teile dieses Codes stammen aus dem Microsoft-Artikel How To Get a Window Handle Without Specifying an Exact Title
 
Option Explicit

Private Declare Function GetDesktopWindow Lib "user32" () As Long

Private Declare Function GetWindow Lib "user32" (ByVal hwnd _
      As Long, ByVal wCmd As Long) As Long

Private Declare Function GetClassName Lib "user32" Alias _
      "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName _
      As String, ByVal nMaxCount 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 GetParent Lib "user32" (ByVal hwnd _
      As Long) As Long

Private Const GW_HWNDNEXT = 2
Private Const GW_CHILD = 5

Public Function FindWindowLike(ByRef hWndArray() As Variant, _
      ByVal hWndStart As Long, ByVal WindowText As String, _
      ByVal Classname As String) As Long

  Static nLevel     As Long
  Static nCounter   As Long

  Dim hwnd          As Long
  Dim hwndMain      As Long

  Dim nRetVal       As Long

  Dim strWndTitle   As String
  Dim strClassName  As String
  Dim strWndType    As String
  Dim strKey        As String

  If nLevel = 0 Then
    If hWndStart = 0 Then hWndStart = GetDesktopWindow()
    nCounter = -1
    ReDim hWndArray(0 To 4, 0 To 0)
  End If

  nLevel = nLevel + 1
  hwnd = GetWindow(hWndStart, GW_CHILD)

  Do Until hwnd = 0

    nRetVal = FindWindowLike(hWndArray(), hwnd, WindowText, _
          Classname)

    strClassName = Space$(64)
    nRetVal = GetClassName(hwnd, strClassName, Len(strClassName))
    strClassName = Left$(strClassName, nRetVal)

    nRetVal = GetWindowTextLength(hwnd)
    If nRetVal > 0 Then
      If nRetVal > 256 Then nRetVal = 255
      strWndTitle = Space$(nRetVal + 1)
      GetWindowText hwnd, strWndTitle, Len(strWndTitle)
      strWndTitle = Left$(strWndTitle, nRetVal)
    Else
      strWndTitle = ""
    End If

    If (UCase$(strWndTitle) Like UCase$(WindowText)) And _
              (UCase$(strClassName) Like UCase$(Classname)) Then

      If GetParent(hwnd) <> 0 Then
        nRetVal = GetParent(hwnd)
        Do While nRetVal
          hwndMain = nRetVal
          nRetVal = GetParent(hwndMain)
        Loop

        strWndType = "Child"
        strKey = CStr(hwndMain) & "h" & CStr(nCounter)
      Else
        strWndType = "Parent"
        strKey = CStr(hwnd) & "h" & CStr(nCounter)
      End If

      nCounter = nCounter + 1
      ReDim Preserve hWndArray(0 To 4, 0 To nCounter)
      hWndArray(0, nCounter) = strWndTitle
      hWndArray(1, nCounter) = CStr(hwnd)
      hWndArray(2, nCounter) = strClassName
      hWndArray(3, nCounter) = strWndType
      hWndArray(4, nCounter) = strKey
    End If

    hwnd = GetWindow(hwnd, GW_HWNDNEXT)
  Loop

  nLevel = nLevel - 1
  FindWindowLike = nCounter + 1
End Function
 
Weitere Links zum Thema
Fenster-Titel, -Handle und -Klassennamen
Fenster-Handle mit Maus-Cursor ermitteln
Hinweis für VBA-Anwender
Die im Download befindliche *.bas-Datei kann für die Verwendung in einem (Office-)Programm im VB-Editor des entsprechenden Programms importiert werden. Die *.frm-Datei kann beispielsweise in Notepad geöffnet werden, und der kommentierte Code über die Zwischenablage in den Code-Bereich einer UserForm kopiert und entsprechend angepasst werden! Ein Import der im Download enthaltenen *.frm-Datei ist nicht möglich.

Windows-Version
95
98/SE
ME
NT
2000
XP
Vista
Win 7
VB-Version
VBA 5
VBA 6
VB 4/16
VB 4/32
VB 5
VB 6


Download  (7,1 kB) Downloads bisher: [ 2350 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Projekte | Tutorials | API-Referenz | VB-/VBA-Tipps | Komponenten | Bücherecke | VB/VBA-Forum | VB.Net-Forum | DirectX-Forum | Foren-Archiv | DirectX | VB.Net-Tipps | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Dienstag, 5. Juli 2011