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.
GetWindowLike.xlsb (Größe: 37,29 KB / Downloads: 2)
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.
GetWindowLike.xlsb (Größe: 37,29 KB / Downloads: 2)
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
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
viele Grüße
Karl-Heinz