六级认证--遍历子窗口句柄源码分享

社区服务
高级搜索
猴岛论坛辅助工具六级认证--遍历子窗口句柄源码分享
发帖 回复
倒序阅读 最近浏览的帖子最近浏览的版块
0个回复

六级认证--遍历子窗口句柄源码分享

楼层直达
mimi_rice

ZxID:55494225

等级: 上士
举报 图酷模式  只看楼主 使用道具 楼主   发表于: 2015-01-13 0
— 本帖被 mimi_rice 执行加亮操作(2015-01-25) —
六级认证--遍历子窗口源码分享


本文按键学院提供技术支持

按键学院交流群(1群已满):376122403
零基础学按键精灵群(2群):372671254





引用
遍历一个窗口的所有子窗口,返回符合条件(标题或类名)的窗口句柄,请写出函数(遍历子窗口).






>>题意解析






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

        如果遍历到类名或标题符合的子窗口,则记录下来。    
        以上图的窗口为例,
        假设我们设置的返回条件是窗口类名=Button,那么只有 窗口句柄为65638这个子窗口符合条件,则返回窗口句柄:65638
        假设我们设置的返回条件是窗口类名=ToolbarWindow32 ,
那么有两个子窗口符合条件,则返回这两个窗口的窗口句柄:65632和65636


引用
有多少童鞋坑在了这一题呢?
是否写了很长的一段代码,但是测试的时候发现就是行不通?
{:4_88:}
不必烦恼不必彷徨,小编今天带来了 工程师06,也就是咱们骚气的06老师的精品代码,
十六行代码搞定遍历子窗口
{:5_139:}




思路




[遍历子窗口源码分享


  1. Function 遍历子窗口(Parent, ClassName)
  2.     Dim RetStr,TmpHdr  //定义局部变量
  3.     Do
  4.         TmpHdr = Plugin.Window.FindEx(Parent, TmpHdr, 0, 0) //查找子窗口
  5.         If TmpHdr Then // 判断是否有查找到子窗口
  6.             If Plugin.Window.GetClass(TmpHdr) = ClassName Then //判断窗口类名
  7.                 RetStr = RetStr & TmpHdr & "|"   //符合则记录窗口句柄
  8.                   RetStr = RetStr & 遍历子窗口(TmpHdr, ClassName)//递归寻找下一级窗口
  9.             Else
  10.                 RetStr = RetStr & 遍历子窗口(TmpHdr, ClassName)//递归寻找下一级窗口
  11.             End If
  12.         End If
  13.     Loop While TmpHdr //如果没有子窗口则退出循环
  14.     遍历子窗口 = RetStr //将查找到的符合的窗口句柄返回
  15. End Function


代码分析


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


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

>>第一重梦境





       先将 RetStr,TmpHdr 两个变量定义成局部变量,局部变量只作用于当前梦境,进入下一重梦境,它们会初始化。

       进入循环,查找子窗口
       我们带来的两个参数,65608 是传递给parent的 ,而 Tmphdr 此刻的值是0/[size=14px]空[size=14px]。
       带入[size=14px]  [size=14px]TmpHdr = Plugin.Window.FindEx(Parent, TmpHdr, 0, 0)  [size=14px]中[size=14px]运算:

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


        判断是否有子窗口
       If TmpHdr Then
       End If
          

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





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


        

>>第二重梦境



       TmpHdr 的值传递给了parent
       ClassName 的值传递给了 ClassName
       之前在第一重梦境里的 RetStr 和TmpHdr 的值在第二重梦境不生效,初始化为0/空
       带入TmpHdr = Plugin.Window.FindEx(Parent, TmpHdr, 0, 0) 中运算:
       TmpHdr = Plugin.Window.FindEx(65614 , 0, 0, 0)
       TmpHdr = 65616


       判断是否有子窗口
       If TmpHdr Then
       End If
          

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





        此时 TmpHdr=65616
                ClassName  值不变
               Parent=65614



>>第三重梦境



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

       判断是否有子窗口
       If TmpHdr Then
       End If
          

        TmpHdr = 0 没有子窗口,则结束判断,结束循环        遍历子窗口 = RetStr       
        我们把查找的结果带上,第三重梦就结束了。

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


>>第二重梦境


       我们进入第三重梦境之前,第二重梦境里:
      
TmpHdr=65616
       ClassName  值不变
       Parent=65614
       这些值没有变化。

       我们接着循环,
       带入TmpHdr = Plugin.Window.FindEx(Parent, TmpHdr, 0, 0) 中运算:
       TmpHdr = Plugin.Window.FindEx(65614 , 65616, 0, 0)  
       TmpHdr = 65618



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


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

       65630 还有一个下级窗口 65632

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





遍历子窗口命令,相关院刊:【院刊】-【201409期】获取子窗口句柄遇到的多种情况
希望对大家的解题思路有所帮助,代码仅供参考哦,照搬的话会被发现的。




本帖de评分: 1 条评分 DB +100
DB+100 2015-01-13

精品文章教程。鼓励他人学习!

« 返回列表
发帖 回复