一个查找指定HWND 窗口中所有控件的函数,极棒(个人瞎吹 :-D)Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As LongPrivate Const WM_GETTEXT = &HD Private Const WM_GETTEXTLENGTH = &HE''hParent 要进行查找的窗口 HWND Public Sub FindOneWindowClild(ByVal hParent As Long) Dim hwnForm As Long Dim strc As String * 255 Dim strURL As String Dim strlen As Long strlen = SendMessage(hParent, WM_GETTEXTLENGTH, 0&, 0&) If strlen Then Call SendMessage(hParent, WM_GETTEXT, strlen + 1, ByVal strc) End If ''加入到列表,用以显示标题 List1.AddItem strc 'Debug.Print Trim(strc) strc = "" strc = vbNullString Call GetClassName(hParent, strc, 255) ''加入到列表,用以显示窗体的注册类 List1.AddItem strc 'Debug.Print Trim(strc) Do hwnForm = FindWindowEx(hParent, hwnForm, vbNullString, vbNullString) If hwnForm <> 0 Then Call FindOneWindowClild(hwnForm) End If Loop Until hwnForm = 0 End Sub
GetWindow VB声明 Declare Function GetWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wCmd As Long) As Long 说明 获得一个窗口的句柄,该窗口与某源窗口有特定的关系 返回值 Long,由wCmd决定的一个窗口的句柄。如没有找到相符窗口,或者遇到错误,则返回零值。会设置GetLastError 参数表 参数 类型及说明 hwnd Long,源窗口 wCmd Long,指定结果窗口与源窗口的关系,它们建立在下述常数基础上: GW_CHILD 寻找源窗口的第一个子窗口 GW_HWNDFIRST 为一个源子窗口寻找第一个兄弟(同级)窗口,或寻找第一个顶级窗口 GW_HWNDLAST 为一个源子窗口寻找最后一个兄弟(同级)窗口,或寻找最后一个顶级窗口 GW_HWNDNEXT 为源窗口寻找下一个兄弟窗口 GW_HWNDPREV 为源窗口寻找前一个兄弟窗口 GW_OWNER 寻找窗口的所有者 注解 兄弟或同级是指在整个分级结构中位于同一级别的窗口。如某个窗口有五个子窗口,那五个窗口就是兄弟窗口。尽管GetWindow可用于枚举窗口,但倘若要在枚举过程中重新定位、创建和清除窗口,那么EnumWindows和EnumChildWindows更为可靠
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As LongPrivate Const WM_GETTEXT = &HD
Private Const WM_GETTEXTLENGTH = &HE''hParent 要进行查找的窗口 HWND
Public Sub FindOneWindowClild(ByVal hParent As Long)
Dim hwnForm As Long
Dim strc As String * 255
Dim strURL As String
Dim strlen As Long
strlen = SendMessage(hParent, WM_GETTEXTLENGTH, 0&, 0&)
If strlen Then
Call SendMessage(hParent, WM_GETTEXT, strlen + 1, ByVal strc)
End If
''加入到列表,用以显示标题
List1.AddItem strc
'Debug.Print Trim(strc)
strc = ""
strc = vbNullString
Call GetClassName(hParent, strc, 255)
''加入到列表,用以显示窗体的注册类
List1.AddItem strc
'Debug.Print Trim(strc)
Do
hwnForm = FindWindowEx(hParent, hwnForm, vbNullString, vbNullString)
If hwnForm <> 0 Then
Call FindOneWindowClild(hwnForm)
End If
Loop Until hwnForm = 0
End Sub
Declare Function GetWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
说明
获得一个窗口的句柄,该窗口与某源窗口有特定的关系
返回值
Long,由wCmd决定的一个窗口的句柄。如没有找到相符窗口,或者遇到错误,则返回零值。会设置GetLastError
参数表
参数 类型及说明
hwnd Long,源窗口
wCmd Long,指定结果窗口与源窗口的关系,它们建立在下述常数基础上:
GW_CHILD 寻找源窗口的第一个子窗口
GW_HWNDFIRST 为一个源子窗口寻找第一个兄弟(同级)窗口,或寻找第一个顶级窗口
GW_HWNDLAST 为一个源子窗口寻找最后一个兄弟(同级)窗口,或寻找最后一个顶级窗口
GW_HWNDNEXT 为源窗口寻找下一个兄弟窗口
GW_HWNDPREV 为源窗口寻找前一个兄弟窗口
GW_OWNER 寻找窗口的所有者
注解
兄弟或同级是指在整个分级结构中位于同一级别的窗口。如某个窗口有五个子窗口,那五个窗口就是兄弟窗口。尽管GetWindow可用于枚举窗口,但倘若要在枚举过程中重新定位、创建和清除窗口,那么EnumWindows和EnumChildWindows更为可靠