title image


Smiley Re: Handle für geschachtelte Fenster gesucht
Option Explicit Declare Function EnumChildWindows Lib "user32" _( _ ByVal hWndParent As Long, _ ByVal lpEnumFunc As Long, _ ByVal lparam& _) As Long Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _( _ ByVal hWnd As Long, _ ByVal lpString As String, _ ByVal cch As Long _) As Long Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" _( _ ByVal hWnd As Long _) As Long Declare Function FindWindow Lib "user32" Alias "FindWindowA" _( _ ByVal lpClassName As String, _ ByVal lpWindowName As String _) As Long Public Sub ShowAllChildWindows() Dim RetVal As Long ' Rückgabewert Dim sRetVal As String Dim hWnd As Long  hWnd = Val(InputBox("Windows-Handle eingeben")) If hWnd = 0 Then sRetVal = InputBox("Was, Sie kennen den Handle nicht?" & vb CrLf & _ "Na schön, dann geben Sie eben den Text" & vbCrLf & _ "in der Titelleiste des Hauptfensters an.") If Len(sRetVal) Then hWnd = FindWindow(vbNullString, sRetVal) End If  If hWnd = 0 Then Exit Sub  RetVal = EnumChildWindows(hWnd, AddressOf EnumChildProc, 0&) If RetVal = 0 Then MsgBox "Hat nicht geklappt", vbCriticalEnd Sub Public Function EnumChildProc(ByVal hWnd As Long, lparam As Long) As Boolean Dim RetVal As Long ' Rückgabewert Dim sBuffer As String Dim cch As Long ' Anzahl Characrters in sBuffer (cch = count chars)  cch = GetWindowTextLength(hWnd) sBuffer = String$(cch, " ") & vbNullChar RetVal = GetWindowText(hWnd, sBuffer, cch) sBuffer = Left(sBuffer, RetVal) Debug.Print "hWnd: "; hWnd; "Titeltext: ", sBuffer  EnumChildProc = True ' Weiter mit nächstem FensterEnd FunctionSieht doch schon ganz beeindruckend aus, nicht wahr?Jetzt haben wir vielleicht nur noch ein kleines Problem: Du sprichst in Deiner Frage von Childfenstern von MS-Access, so daß sich mir der Verdacht aufdrängt, Du möchtest diese Funktion in Access einsetzen. Damit jedoch wirst Du auf die Nase fallen, da MS-Access den AddressOf - Operator nicht anbietet.Dafür gäbe es zwei mögliche Workarrounds, die beide Visual Basic verwenden:1.) erstelle eine ActiveX - DLL in VB und sorge dafür, daß die dortige Klasse alle Handles z.B. in einem Array speichert, das Du hinterher auslesen kannst. Oder eleganter:2.) erstelle ein UserControl in VB. Dieses UserControl könntest Du dann auf einem Formular in Access anordnen. Dadurch könnte das UserControl bei jedem Aufruf der Callback-Funktion ein Ereignis auslösen, auf das Access dann reagieren könnte.Viel Erfolg!Thomas Prötzschcu
Thomas Prötzsch

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: