广告合作
  • 今日头条

    今日头条

  • 百度一下

    百度一下,你就知道

  • 新浪网

    新浪网 - 提供新闻线索,重大新闻爆料

  • 搜狐

    搜狐

  • 豆瓣

    豆瓣

  • 百度贴吧

    百度贴吧——全球领先的中文社区

  • 首页 尚未审核订阅工具 订阅

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

    来源:网络收集  点击:  时间:2024-04-18
    【导读】:
    遍历一个窗口的所有子窗口,返回符合条件(标题或类名)的窗口句柄,请写出函数(遍历子窗口).工具/原料more按键精灵2014方法/步骤1/17分步阅读

    题意解析

    2/17

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

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

    以上图的窗口为例,

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

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

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

    3/17

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

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

    4/17

    思路

    5/17

    遍历子窗口源码分享

    Function遍历子窗口(Parent,ClassName)

    DimRetStr,TmpHdr//定义局部变量

    Do

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

    IfTmpHdrThen//判断是否有查找到子窗口

    IfPlugin.Window.GetClass(TmpHdr)=ClassNameThen//判断窗口类名

    RetStr=RetStrTmpHdr|//符合则记录窗口句柄

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

    Else

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

    EndIf

    EndIf

    LoopWhileTmpHdr//如果没有子窗口则退出循环

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

    EndFunction

    6/17

    代码分析

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

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

    7/17

    第一重梦境

    先将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/17

    判断是否有子窗口

    IfTmpHdrThen

    EndIf

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

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

    9/17

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

    10/17

    第二重梦境

    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/17

    判断是否有子窗口

    IfTmpHdrThen

    EndIf

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

    ClassName=Button

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

    12/17

    此时TmpHdr=65616ClassName值不变

    Parent=65614

    13/17

    第三重梦境

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

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

    14/17

    判断是否有子窗口

    IfTmpHdrThen

    EndIf

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

    遍历子窗口=RetStr

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

    15/17

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

    第二重梦境

    我们进入第三重梦境之前,第二重梦境里: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

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

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

    17/17

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

    教程
    本文关键词:

    版权声明:

    1、本文系转载,版权归原作者所有,旨在传递信息,不代表看本站的观点和立场。

    2、本站仅提供信息发布平台,不承担相关法律责任。

    3、若侵犯您的版权或隐私,请联系本站管理员删除。

    4、文章链接:http://www.1haoku.cn/art_535426.html

    相关资讯

    ©2019-2020 http://www.1haoku.cn/ 国ICP备20009186号05-06 08:08:49  耗时:0.028
    0.0284s