已知窗口句柄,怎么得到所有控件的句柄?

killerdanny 2003-08-08 03:49:21
RT
...全文
96 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
gpo2002 2003-08-08
  • 打赏
  • 举报
回复
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
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal Hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal Hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Private Sub Form_Load()
Dim Hwnd As Long
Hwnd = FindWindow("ThunderRt6FormDC", "Form1")
Call GetAllHwnd(Hwnd, "ThunderRt6FormDC", "Form1")

End Sub

Private Sub GetAllHwnd(ByRef Hwnd As Long, ByVal ClsNm As String, ByVal WinNm As String)

Dim chWnd As Long
Dim lsClsNm As String


If Hwnd <> 0 Then

Do
chWnd = FindWindowEx(Hwnd, chWnd, vbNullString, vbNullString)
If chWnd = 0 Then
Exit Do
End If

Debug.Print chWnd & Space(5) & Hex(chWnd)

Call GetAllHwnd(chWnd, GetClsNm(Hwnd), GetWinNm(Hwnd))

Loop While chWnd <> 0

End If
End Sub

Private Function GetWinNm(ByRef Hwnd As Long) As String
Dim ls As String
ls = String(256, Chr$(0))
GetWindowText Hwnd, ls, 256
GetWinNm = Left$(ls, InStr(ls, Chr$(0)) - 1)
End Function

Private Function GetClsNm(ByRef Hwnd As Long) As String
Dim ls As String
ls = String(256, Chr$(0))
GetClassName Hwnd, ls, 256
GetClsNm = Left$(ls, InStr(ls, Chr$(0)) - 1)
End Function
david1981 2003-08-08
  • 打赏
  • 举报
回复
基本每个控件都有其系统中唯一的标识(句柄)
hisofty 2003-08-08
  • 打赏
  • 举报
回复
用这个api,枚举子窗口

EnumChildWindows

VB声明
Declare Function EnumChildWindows Lib "user32" Alias "EnumChildWindows" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
说明
为指定的父窗口枚举子窗口
返回值
Long,非零表示成功,零表示失败
参数表
参数 类型及说明
hWndParent Long,欲枚举子窗口的父窗口的句柄
lpEnumFunc Long,为每个子窗口调用的函数的指针。用AddressOf运算符获得函数在一个标准模块中的地址
lParam Long,在枚举期间,传递给dwcbkd32.ocx定制控件之EnumWindows事件的值。这个值的含义是由程序员规定的。(原文:Value that is passed to the EnumWindows event of the dwcbkd32.ocx custom control during enumeration. The meaning of this value is defined by the programmer.)
注解
在vb4下要求dwcbkd32.ocx定制控件。子窗口下属的子窗口也可由这个函数枚举


循环调用这个api也可以
FindWindowEx

VB声明
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
说明
在窗口列表中寻找与指定条件相符的第一个子窗口
返回值
Long,找到的窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError
参数表
参数 类型及说明
hWnd1 Long,在其中查找子的父窗口。如设为零,表示使用桌面窗口(通常说的顶级窗口都被认为是桌面的子窗口,所以也会对它们进行查找)
hWnd2 Long,从这个窗口后开始查找。这样便可利用对FindWindowEx的多次调用找到符合条件的所有子窗口。如设为零,表示从第一个子窗口开始搜索
lpsz1 String,欲搜索的类名。零表示忽略
lpsz2 String,欲搜索的类名。零表示忽略


killerdanny 2003-08-08
  • 打赏
  • 举报
回复
窗口内的所有控件的句柄,要求用纯API实现!

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧