资源预览内容
第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
第9页 / 共12页
第10页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
按键精灵开发教程:遍历子窗口来源:按键学院 【按键精灵】遍历一个窗口的所有子窗口,返回符合条件(标题或类名)的窗口句柄,请写出函数(遍历子窗口).题意解析假设红色框框圈起来的就是我们要遍历的窗口。那么,我们要遍历到的是这个窗口下的所有子窗口,二级子窗口,三级子窗口有多少级都要遍历下去。如果遍历到类名或标题符合的子窗口,则记录下来。以上图的窗口为例,假设我们设置的返回条件是窗口类名=Button,那么只有 窗口句柄为 65638 这个子窗口符合条件,则返回窗口句柄:65638假设我们设置的返回条件是窗口类名=ToolbarWindow32 ,那么有两个子窗口符合条件,则返回这两个窗口的窗口句柄:65632 和 65636有多少童鞋坑在了这一题呢?是否写了很长的一段代码,但是测试的时候发现就是行不通?不必烦恼不必彷徨,小编今天带来了 工程师 06,也就是咱们骚气的 06 老师的精品代码,十六行代码搞定遍历子窗口思路遍历子窗口源码分享Function 遍历子窗口(Parent, ClassName)Dim RetStr,TmpHdr /定义局部变量DoTmpHdr = Plugin.Window.FindEx(Parent, TmpHdr, 0, 0) /查找子窗口If TmpHdr Then / 判断是否有查找到子窗口If Plugin.Window.GetClass(TmpHdr) = ClassName Then /判断窗口类名RetStr = RetStr & TmpHdr & | /符合则记录窗口句柄RetStr = RetStr & 遍历子窗口(TmpHdr, ClassName)/递归寻找下一级窗口ElseRetStr = RetStr & 遍历子窗口(TmpHdr, ClassName)/递归寻找下一级窗口End IfEnd IfLoop While TmpHdr /如果没有子窗口则退出循环遍历子窗口 = RetStr /将查找到的符合的窗口句柄返回End Function代码分析要怎么理解递归呢?盗梦空间不知道大伙有没有看过,小编很喜欢这部电影,刺激带感咳咳 言归正传我们可以把递归比作梦境来理解。整个 遍历子窗口 函数就是一个梦境当我们在脚本开始的时候,还清醒着。TracePrint 遍历子窗口(65608,Button)执行这句的时候,我们就带着 65608,Button这两个参数值进入了第一重梦境第一重梦境先将 RetStr,TmpHdr 两个变量定义成局部变量,局部变量只作用于当前梦境,进入下一重梦境,它们会初始化。进入循环,查找子窗口我们带来的两个参数,65608 是传递给 parent 的 ,而 Tmphdr 此刻的值是 0/空。带入 TmpHdr = Plugin.Window.FindEx(Parent, TmpHdr, 0, 0) 中运算:TmpHdr = Plugin.Window.FindEx(65608, 0, 0, 0)TmpHdr = 65614判断是否有子窗口If TmpHdr ThenEnd IfTmpHdr = 65614 有子窗口,则判断窗口句柄类名我们带来的两个参数,Button 是传递给 ClassName 的 带入 if Plugin.Window.GetClass(TmpHdr) = ClassName Then 中运算:当前子窗口的类名为:TrayNotifyWnd不符合要求,则执行 else 后面的语句:RetStr = RetStr & 遍历子窗口(TmpHdr, ClassName)执行这一句,又调用了 遍历子窗口 函数,带着 TmpHdr, ClassName 进入了第二重梦境。 此时 TmpHdr=65614 ClassName 值不变parent=65608第二重梦境TmpHdr 的值传递给了 parentClassName 的值传递给了 ClassName之前在第一重梦境里的 RetStr 和 TmpHdr 的值在第二重梦境不生效,初始化为 0/空带入 TmpHdr = Plugin.Window.FindEx(Parent, TmpHdr, 0, 0) 中运算:TmpHdr = Plugin.Window.FindEx(65614 , 0, 0, 0)TmpHdr = 65616判断是否有子窗口If TmpHdr ThenEnd IfTmpHdr = 65616 有子窗口,则判断窗口句柄类名ClassName=Button带入 if Plugin.Window.GetClass(TmpHdr) = ClassName Then 中运算:当前子窗口的类名为:TrayClockWClass不符合要求,则执行 else 后面的语句:RetStr = RetStr & 遍历子窗口(TmpHdr, ClassName)执行这一句,又调用了 遍历子窗口 函数,带着 TmpHdr, ClassName 进入了第三重梦境。 此时 TmpHdr=65616ClassName 值不变Parent=65614第三重梦境TmpHdr 的值传递给了 parentClassName 的值传递给了 ClassName带入 TmpHdr = Plugin.Window.FindEx(Parent, TmpHdr, 0, 0) 中运算:TmpHdr = Plugin.Window.FindEx(65616 , 0, 0, 0)TmpHdr = 0 判断是否有子窗口If TmpHdr ThenEnd IfTmpHdr = 0 没有子窗口,则结束判断,结束循环遍历子窗口 = RetStr 我们把查找的结果带上,第三重梦就结束了。第三重梦结束,我们在第二重梦醒来。第二重梦境我们进入第三重梦境之前,第二重梦境里:TmpHdr=65616ClassName 值不变Parent=65614这些值没有变化。我们接着循环,带入 TmpHdr = Plugin.Window.FindEx(Parent, TmpHdr, 0, 0) 中运算:TmpHdr = Plugin.Window.FindEx(65614 , 65616, 0, 0) TmpHdr = 65618接下去的推算和上面的二重步入到三重梦境的一样的。进入第三重发现没有子窗口,梦醒回到第二重,继续第二重的梦境,继续循环。当第二重执行到没有子窗口的时候,则梦醒回到第一重梦境。当然,后面还会进入更多重的梦境例如:65630 还有一个下级窗口 65632所以进入到第三重梦境的时候,还没有结束,会进入第四重梦境,第四重梦境里没有找到子窗口,则梦醒,回到第三重梦境,第三重梦境再继续循环,发现已经没有其它的下级窗口了,则梦醒,回到第二重梦境,继续循环。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号