Jim Dettman
jimdettman at verizon.net
Mon May 23 09:57:42 CDT 2011
<<What I want to know is how does he figure out the name of the objects?
for example...>>
One way is to enumerate all the child windows when something is running:
Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long,
_
ByVal lParam As Long) As Long
Private Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As
_
Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Declare Function GetWindowTextLength Lib "user32.dll" Alias
"GetWindowTextLengthA" (ByVal hWnd As Long) As Long
Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA"
(ByVal hWnd As Long, ByVal lpString As String, ByVal nMaxCount As Long) As
Long
Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" (ByVal
hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
' The following variables are shared between the main ChildWindows procedure
' and the auxiliary (private) ChildWindows_CBK routine
' An array of Long holding the handle of all child windows.
Dim windows() As Long
' The number of elements in the array.
Dim windowsCount As Long
Sub getWindows()
Dim lnghwnd As Long
lnghwnd = CLng(Application.hWndAccessApp)
Debug.Print ChildWindows(lnghwnd)
End Sub
' Return an array of Long holding the handles of all the child windows
' of a given window. If hWnd = 0 it returns all the top-level windows.
Function ChildWindows(ByVal hWnd As Long)
windowsCount = 0
If hWnd Then
EnumChildWindows hWnd, AddressOf EnumWindows_CBK, 1
Else
EnumWindows AddressOf EnumWindows_CBK, 1
End If
' Trim uninitialized elements and return to caller.
ReDim Preserve windows(windowsCount) As Long
End Function
' The callback routine, common to both EnumWindows and EnumChildWindows.
Private Function EnumWindows_CBK(ByVal hWnd As Long, ByVal lParam As Long)
As _
Long
Dim slength As Long
Dim buffer As String
Dim retval As Variant
Dim classname As String
' Make room in the array, if necessary.
If windowsCount = 0 Then
ReDim windows(100) As Long
ElseIf windowsCount >= UBound(windows) Then
ReDim Preserve windows(windowsCount + 100) As Long
End If
' Store the new item.
windowsCount = windowsCount + 1
windows(windowsCount) = hWnd
slength = GetWindowTextLength(hWnd) + 1 ' get length of title bar text
buffer = Space(slength) ' make room in the buffer
retval = GetWindowText(hWnd, buffer, slength) ' get title bar text
Debug.Print "Window #"; windowsCount ' display number of enumerated
window
Debug.Print "Handle: "; hWnd
Debug.Print ; "Title:"; Left(buffer, slength - 1) ' display title bar text
of enumerated window
classname = Space(255)
slength = GetClassName(hWnd, classname, 255)
classname = Left(classname, slength) ' remove empty space
Debug.Print ; "Class: "; classname
Debug.Print
' Return 1 to continue enumeration.
EnumWindows_CBK = 1
End Function
<<snip>>