按键精灵开发教程:遍历子窗口

2025-10-19 10:39:40

1、>>题意解析

按键精灵开发教程:遍历子窗口

2、假设红色框框圈起来的就是我们要遍历的窗口。那么,我们要遍历到的是这个窗口下的所有子窗口,二级子窗口,三级子窗口……有多少级都要遍历下去。

如果遍历到类名或标题符合的子窗口,则记录下来。

以上图的窗口为例,

        假设我们设置的返回条件是窗口类名=Button,

        那么只有 窗口句柄为65638这个子窗口符合条件,则返回窗口句柄:65638        假设我们设置的返回条件是窗口类名=ToolbarWindow32 ,

        那么有两个子窗口符合条件,则返回这两个窗口的窗口句柄:65632和65636

3、有多少童鞋坑在了这一题呢?是否写了很长的一段代码,但是测试的时候发现就是行不通?不必烦恼不必彷徨,小编今天带来了 工程师06,也就是咱们骚气的06老师的精品代码,

十六行代码搞定遍历子窗口

4、思路

按键精灵开发教程:遍历子窗口

5、遍历子窗口源码分享

Function 遍历子窗口(Parent, ClassName)

    Dim RetStr,TmpHdr  //定义局部变量

    Do

        TmpHdr = Plugin.Window.FindEx(Parent, TmpHdr, 0, 0) //查找子窗口

        If TmpHdr Then // 判断是否有查找到子窗口

            If Plugin.Window.GetClass(TmpHdr) = ClassName Then //判断窗口类名

                RetStr = RetStr & TmpHdr & "|"   //符合则记录窗口句柄

                  RetStr = RetStr & 遍历子窗口(TmpHdr, ClassName)//递归寻找下一级窗口

            Else

                RetStr = RetStr & 遍历子窗口(TmpHdr, ClassName)//递归寻找下一级窗口

            End If

        End If

    Loop While TmpHdr //如果没有子窗口则退出循环

    遍历子窗口 = RetStr //将查找到的符合的窗口句柄返回

End Function

6、代码分析

要怎么理解递归呢?《盗梦空间》不知道大伙有没有看过,小编很喜欢这部电影,刺激带感……咳咳 言归正传我们可以把递归比作梦境来理解。

整个  遍历子窗口   函数就是一个梦境当我们在脚本开始的时候,还清醒着。TracePrint 遍历子窗口(65608,"Button")执行这句的时候,我们就带着 65608,"Button"这两个参数值进入了第一重梦境

7、>>第一重梦境

先将 RetStr,TmpHdr 两个变量定义成局部变量,局部变量只作用于当前梦境,进入下一重梦境,它们会初始化。进入循环,查找子窗口我们带来的两个参数,65608 是传递给parent的 ,而 Tmphdr 此刻的值是0/空。

带入  TmpHdr = Plugin.Window.FindEx(Parent, TmpHdr, 0, 0)  中运算:

       TmpHdr = Plugin.Window.FindEx(65608, 0, 0, 0)       TmpHdr = 65614

按键精灵开发教程:遍历子窗口

8、判断是否有子窗口

          If TmpHdr Then

          End If

          TmpHdr = 65614 有子窗口,则判断窗口句柄类名

我们带来的两个参数,"Button" 是传递给 ClassName的 带入 if Plugin.Window.GetClass(TmpHdr) = ClassName Then 中运算:当前子窗口的类名为:TrayNotifyWnd不符合要求,则执行else后面的语句:RetStr = RetStr & 遍历子窗口(TmpHdr, ClassName)执行这一句,又调用了 遍历子窗口 函数,带着TmpHdr, ClassName 进入了第二重梦境。

按键精灵开发教程:遍历子窗口

9、 此时 TmpHdr=65614         ClassName  值不变       parent=65608

10、>>第二重梦境

TmpHdr 的值传递给了parentClassName 的值传递给了 ClassName之前在第一重梦境里的 RetStr 和TmpHdr 的值在第二重梦境不生效,初始化为0/空

带入  TmpHdr = Plugin.Window.FindEx(Parent, TmpHdr, 0, 0)  中运算:

TmpHdr = Plugin.Window.FindEx(65614 , 0, 0, 0)TmpHdr = 65616

按键精灵开发教程:遍历子窗口

11、判断是否有子窗口

           If TmpHdr Then

           End If

                  TmpHdr = 65616 有子窗口,则判断窗口句柄类名

        ClassName="Button"

        带入 if Plugin.Window.GetClass(TmpHdr) = ClassName Then 中运算:        当前子窗口的类名为:TrayClockWClass        不符合要求,则执行else后面的语句:        RetStr = RetStr & 遍历子窗口(TmpHdr, ClassName)        执行这一句,又调用了 遍历子窗口 函数,带着TmpHdr, ClassName 进入了第三重梦境。

按键精灵开发教程:遍历子窗口

12、  此时 TmpHdr=65616         ClassName  值不变

         Parent=65614

13、>>第三重梦境

      TmpHdr 的值传递给了parent     ClassName 的值传递给了 ClassName      带入  TmpHdr = Plugin.Window.FindEx(Parent, TmpHdr, 0, 0)  中运算:

      TmpHdr = Plugin.Window.FindEx(65616 , 0, 0, 0)      TmpHdr = 0

按键精灵开发教程:遍历子窗口

14、  判断是否有子窗口

           If TmpHdr Then

           End If

        TmpHdr = 0 没有子窗口,则结束判断,结束循环

        遍历子窗口 = RetStr       

        我们把查找的结果带上,第三重梦就结束了。

按键精灵开发教程:遍历子窗口

15、第三重梦结束,我们在第二重梦醒来。

>>第二重梦境

我们进入第三重梦境之前,第二重梦境里:       TmpHdr=65616

       ClassName  值不变

       Parent=65614

       这些值没有变化。       我们接着循环,

       带入  TmpHdr = Plugin.Window.FindEx(Parent, TmpHdr, 0, 0)  中运算:

       TmpHdr = Plugin.Window.FindEx(65614 , 65616, 0, 0)         TmpHdr = 65618

按键精灵开发教程:遍历子窗口

16、接下去的推算和上面的二重步入到三重梦境的一样的。进入第三重发现没有子窗口,梦醒回到第二重,继续第二重的梦境,继续循环。当第二重执行到没有子窗口的时候,则梦醒回到第一重梦境。

当然,后面还会进入更多重的梦境例如:

按键精灵开发教程:遍历子窗口

17、还有一个下级窗口 65632所以进入到第三重梦境的时候,还没有结束,会进入第四重梦境,第四重梦境里没有找到子窗口,则梦醒,回到第三重梦境,第三重梦境再继续循环,发现已经没有其它的下级窗口了,则梦醒,回到第二重梦境,继续循环。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢