Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Finden von Fenstern - Handle-Ermittlung
#1
Liebe Leserin, lieber Leser,

zum Ermitteln des Handle einer im Speicher geladenen also aktiven App oder einer Dialogbox usw. gibt es ja die bekannte und beliebte Windowsfunktion FindWindow.

Hier kann die Klasse und/oder der Fenstertext der gesuchten Anwendung angegeben werden. Leider erlaubt diese Funktion nicht die Verwendung von Platzhaltern.
Sind Klasse oder Fenstertext nicht genau bekannt, kann man diese Funktion nicht verwenden.

Hier stelle ich mal eine Version bereit, die das Finden von Fenstern mittels Suchbegriffes incl. Sternchen ermöglicht.

PS: Das gleiche gilt natürlich auch für das Ermitteln von Buttons (Childwindows) in einer Anwendung. Hierzu gibt es auch ein Beispiel in der anliegenden Datei.


.xlsb   GetWindowLike.xlsb (Größe: 37,29 KB / Downloads: 0)


Code:

Option Explicit
Option Compare Text

Private Declare PtrSafe Function EnumWindows Lib "user32" ( _
        ByVal lpEnumFunc As LongPtr, ByVal lparam As LongPtr) As Long
Private Declare PtrSafe Function GetWindowTextA Lib "user32" ( _
        ByVal hWnd As LongPtr, ByVal lpString As String, _
        ByVal cch As Long) As Long
Private Declare PtrSafe Function GetClassNameA Lib "user32" ( _
        ByVal hWnd As LongPtr, ByVal lpClassName As String, _
        ByVal nMaxCount As Long) As Long

Private Type GetWndParam_STRUCT
   hWnd         As LongPtr
   sWindowTitle As String
   sClassname   As String
End Type
Dim tParams As GetWndParam_STRUCT

Function GetWindowLike(sWindowTitle As String, sClassname As String) As LongPtr
' Ermittelt das Handle eines Fensters anhand eines Teiltextes und /oder  Klasse
  With tParams
     .sWindowTitle = IIf(sWindowTitle = "", "*", sWindowTitle)  ' Suchtext   übernehmen
     .sClassname = IIf(sClassname = "", "*", sClassname)        ' Suchklasse übernehmen
     .hWnd = 0
     Call EnumWindows(AddressOf EnumWindowProc, VarPtr(tParams))
     GetWindowLike = .hWnd                                      ' Gefundenes Handle zurückgeben
  End With
End Function

Private Function EnumWindowProc(ByVal hWnd As LongPtr, lparam As GetWndParam_STRUCT) As Long
  Dim sText As String * 255, sClass As String
  
  With lparam
     Call GetClassNameA(hWnd, sText, 255)                       ' Klassenamen holen
     sClass = Left$(sText, InStr(sText, vbNullChar) - 1)        ' Bereinigen
     If sClass Like .sClassname Then
        Call GetWindowTextA(hWnd, sText, 255)                   ' Fenstertext holen
        If Left$(sText, InStr(sText, vbNullChar) - 1) Like .sWindowTitle Then
           .sClassname = sClass
           .sWindowTitle = Left$(sText, InStr(sText, vbNullChar) - 1)
           lparam.hWnd = hWnd                                   ' Handle übernehmen
           EnumWindowProc = 0: Exit Function
        End If
     End If
  End With
  EnumWindowProc = 1
End Function
 
 
' ###################################################################
Sub Fensterermittlung()
' Beispiel zum Aufruf der Funktion
  With Tabelle1
     If GetWindowLike(.Range("B3").Value, .Range("B4").Value) <> 0 Then
        .Range("B3").Value = tParams.sWindowTitle
        .Range("B4").Value = tParams.sClassname
        .Range("B5").Value = tParams.hWnd
     End If
  End With
End Sub

_________
viele Grüße
Karl-Heinz
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste