已知控件名如何找到其句柄?

houseofcodes 2005-04-06 10:01:14
用spy++看到所有类名,但是发现当父类为A,有三个子类为B,B有三个子类为C,要找的句柄为C的子类的句柄,应该怎么办呀?
我用lhwnd = FindWindowEx(lhwnd, 0, sClassName, vbNullString)
一步一步的找,找到C的时候返回的值就是0了。

另外能不能不用递归?
...全文
279 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
homezj 2005-04-07
  • 打赏
  • 举报
回复
写错了一点,上面ahwnd与lhwnd是同一个变量,你自己换一下。
homezj 2005-04-07
  • 打赏
  • 举报
回复
Sorry!是我看错了。
你是问“能不能不用递归”?
我当成是“能不能用递归”?

漏了一个字,意思反了!

如果,你能确定,只有这三个层次,当然可以不用递归;
对于B层有三个相同子类,你如果不能用标题分清,你要找的C在哪一个下面,可用Do循环,如:
ahwnd = FindWindow("A", vbNullString)
bhwnd = FindWindowEx(lhwnd, 0, "B", vbNullString)
Do While bhwnd<>0
chwnd = FindWindowEx(bhwnd, 0, "C", vbNullString)
if chwnd<>0 then exit do
bhwnd = FindWindowEx(lhwnd, bhwnd, "B", vbNullString)
loop

chwnd就是你要找的。

查找窗口,虽可用EnumWindows与EnumChildWindows,但不太合适,而且有点慢
houseofcodes 2005-04-07
  • 打赏
  • 举报
回复
搞定了,明天结帖,这样可多20分感谢小吉大哥。
wzzwwz 2005-04-07
  • 打赏
  • 举报
回复
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,欲搜索的类名。零表示忽略

wzzwwz 2005-04-07
  • 打赏
  • 举报
回复
EnumWindows

VB声明
Declare Function EnumWindows& Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long)
说明
枚举窗口列表中的所有父窗口(顶级和被所有窗口)
返回值
Long,非零表示成功,零表示失败
参数表
参数 类型及说明
lpEnumFunc Long,指向为每个子窗口都调用的一个函数的指针。用AddressOf运算符获得函数在标准模式下的地址
lParam Long,在枚举期间,传递给dwcbkd32.ocx定制控件之EnumWindows事件的值。这个值的含义是由程序员规定的

EnumThreadWindows

VB声明
Declare Function EnumThreadWindows Lib "user32" Alias "EnumThreadWindows" (ByVal dwThreadId As Long, ByVal lpfn As Long, ByVal lParam As Long) As Long
说明
枚举与指定任务相关的窗口
返回值
Long,非零表示成功,零表示失败
参数表
参数 类型及说明
dwThreadId Long,某线程的标识符,它的窗口将被枚举
lpfn Long,指向一个函数的指针,要求为每个子窗口都调用这个函数。用AddressOf运算符获得函数在标准模式下的地址
lParam Long,在枚举期间,传递给dwcbkd32d.ocx定制控件之EnumWindows事件的值。这个值的含义是由程序员规定的
注解
子窗口下属的其他子窗口也可由这个函数枚举


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定制控件。子窗口下属的子窗口也可由这个函数枚举



FindWindow

VB声明
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
说明
寻找窗口列表中第一个符合指定条件的顶级窗口(在vb里使用:FindWindow最常见的一个用途是获得ThunderRTMain类的隐藏窗口的句柄;该类是所有运行中vb执行程序的一部分。获得句柄后,可用api函数GetWindowText取得这个窗口的名称;该名也是应用程序的标题)
返回值
Long,找到窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError
参数表
参数 类型及说明
lpClassName String,指向包含了窗口类名的空中止(C语言)字串的指针;或设为零,表示接收任何类
lpWindowName String,指向包含了窗口文本(或标签)的空中止(C语言)字串的指针;或设为零,表示接收任何窗口标题
注解
很少要求同时按类与窗口名搜索。为向自己不准备参数传递一个零,最简便的办法是传递vbNullString常数

示例
Dim hw&, cnt&
Dim rttitle As String * 256
hw& = FindWindow("ThunderRT5Main", vbNullString) ' ThunderRTMain under VB4
cnt = GetWindowText(hw&, rttitle, 255)
MsgBox Left$(rttitle, cnt), 0, "RTMain title"

houseofcodes 2005-04-07
  • 打赏
  • 举报
回复
而且EnumWindows与EnumChildWindows消耗cpu好像有点厉害。。。
houseofcodes 2005-04-07
  • 打赏
  • 举报
回复
谢谢小吉大哥,我也觉得EnumWindows与EnumChildWindows效率有点低,我先试试你的。
houseofcodes 2005-04-06
  • 打赏
  • 举报
回复
什么叫做“起始位置”?能不能不用递归啊?
homezj 2005-04-06
  • 打赏
  • 举报
回复
FindWindowEx的第二个参数,可以指定起始位置,所以可以用递归
唐古拉山 2005-04-06
  • 打赏
  • 举报
回复

主要用到几个API:

EnumWindows,EnumThreadWindows,EnumChildWindows

1,486

社区成员

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

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