找回密码
 加入
搜索
查看: 1435|回复: 2

求助:单线程点击多窗口某个窗口意外退出时

[复制链接]
发表于 2009-3-10 10:57:15 | 显示全部楼层 |阅读模式
主要的问题:比如当autoit在点击5个窗口时,如果有某个窗口在点击的过程中意外退出,启动窗口的进程被杀。变成4个窗口时autoit就会停滞不前,有没有能忽略掉退出的窗口而继续点击余下的4个窗口呢?更明白一点就是用autoit点击5个世界通的广告播放器,当其中一个播放窗口意外退出时autoit停滞,能不能监视窗口的数量减少时更新$wintotal=winlist("","")的窗口列表。

点击多窗口的思路是:
1.有30+名称标题相同的窗口,使用mod(30,5)一次同时处理5个窗口,当打开的窗口少于5个时,查找下5个窗口,第二次打开后会打开1-9个窗口不等。
2.使用$wintotal=winlist("","")获取窗口的总数和列表
3.使用外循环控制点击单个窗口的次数。使用内循环 for $i to $wintotal[0][0] 依次激活每一个打开的窗口,处理后sleep(1000)进入下个窗口。每个窗口点击30遍(注意:不能一次点击一个窗口30遍后进入下个窗口)
4.把$wintotal[0][0]的值赋予另一个全局变量$sm, 使用AdlibEnable()监视$wintotal[0][0]==$sm,由于窗口掉出时$wintotal[0][0]的值未更新,$wintotal[0][0]==$sm判断下的语句不会实行,不能直接设置$sm的值为5。设也没效果。
5.当窗口掉出时,程序停滞。

#Include <GuiToolBar.au3>
Global $istep,$sn,$sm,$wintotal
$istep = 1
$sm = 5
_Lookup_SysTray(0)

If @error Then MsgBox(48, "Failure", "Required item not found")
Func _SysTray_ClickItem($iTitle, $iButton = "left", $iClick = 1, $sMove = False, $iSpeed = 1)
EndFunc
Func _Lookup_SysTray($index) ;在任务栏图表中查找已登入的账号
        AdlibEnable("_killnew")        
        for $sn = $index to 40 Step $istep        
                _SysTray_ClickItem("世界通: m"&$sn&"(在线)", "right", 1,True,1)        
                If Not @error Then
                        _Mousepos() ;鼠标双击图标
                        If Not WinList("广告播放器","更多消息") Then ;没弹出播放器时点击图标列表
                        _MouseposL()
                        _MouseposR()
                        EndIf
                        MouseClick("left",0,0,1)
                        If Mod($sn,$sm) = 0 Then 
                                        $wintotal = WinList("广告播放器","更多消息")
                                        If $wintotal[0][0] == $sm Then
                                                For $j = 1 To $sm Step 1
                                                        WinMove($wintotal[$j][1],"",100+30*$j,100+10*$j)
                                                Next
                                        
                                                
                                        EndIf
                        _clickad()
                        EndIf
                        
                EndIf
        Next
        AdlibDisable()        
EndFunc        
func _clickad() ;点击广告播放器
        Local $i,$k
                $wintotal = WinList("广告播放器","更多消息")
                ;MsgBox(0,"",$wintotal[1][1])
                WinActivate($wintotal[1][1],"")
                AdlibEnable("_killpop")
                For $i = 0 To 17 Step 1 ;点击1-16条,鼠标向下循环
                        For $k=1 to $sm Step 1
                        ControlClick($wintotal[$k][1],"","Button6")
                        Send("{enter}")
                        Sleep(500)        
                        WinActivate($wintotal[$k][1])
                        WinWaitActive($wintotal[$k][1])
                        ControlClick($wintotal[$k][1],"","SysListView321","left",1,70,25+15*$i)
                        If $k ==1 Then
                        Sleep(3500)
                        Else
                        Sleep(1000)
                        EndIf
                        ControlClick($wintotal[$k][1],"","SysListView321","left",1,70,25+15*$i)
                        Next
                        Sleep(500)
                Next
                WinActivate($wintotal[1][1],"")
                For $i = 0 To 14 Step 1 ;17条之后点击,条目自动向上跳
                        For $k=1 to $sm Step 1
                        
                        ControlClick($wintotal[$k][1],"","Button6")
                        Send("{enter}")
                        Sleep(500)
                        WinActivate($wintotal[$k][1])
                        WinWaitActive($wintotal[$k][1])
                        ControlClick($wintotal[$k][1],"","SysListView321","left",2,70,294)
                        If $k ==1 Then
                        Sleep(3500)
                        Else
                        Sleep(1000)
                        EndIf
                        ControlClick($wintotal[$k][1],"","SysListView321","left",1,70,294)
                        ;Sleep(500)
                        ;ControlClick($wintotal[$k][1],"SysListView321","left",2,70,280)
                        Next
                        Sleep(500)
                        ;WinActivate($wintotal[$k][1])

                Next
                AdlibDisable()
                For $k=1 to $sm Step 1
                WinClose($wintotal[$k][1])
                Next
EndFunc        
Func _killpop() ;关闭弹出窗口
        If WinExists("世界通广告回复","谢谢您的支持") then
                WinClose("世界通广告回复","谢谢您的支持") 
        ElseIf WinExists("世界通广告回复","正在播放") then
                WinClose("世界通广告回复","正在播放")
        ElseIf WinExists("世界通广告回复","请耐心看完广告再做回复,谢谢您的支持") Then
                WinClose("世界通广告回复","请耐心看完广告再做回复,谢谢您的支持")
                Sleep(1000)
                ControlClick("广告播放器","更多消息","Button6")
                Send("{enter}")
        ElseIf        WinExists("广告回复","是否需要停止下载") then
                ControlClick("广告回复","","Button2")
        ElseIf WinExists("世界通广告回复","您已经回复了此广告") then
                WinClose("世界通广告回复","您已经回复了此广告")
        ElseIf $wintotal[0][0]<>$sm Then
                        $wintotal=WinList("广告播放器","更多消息")
                        $sm = $wintotal[0][0]
        ElseIf Not WinActive("广告播放器","更多消息") Then
                Sleep(3000)
                WinActivate("广告播放器","更多消息")
        
        EndIf
EndFunc        

自己摸出来了,使用WinExists($wintotal[$k][1]) 监视循环的窗口即可。不存在的窗口直接忽略,不做任何操作。

[ 本帖最后由 lumb 于 2009-3-11 00:32 编辑 ]
发表于 2009-3-10 14:20:25 | 显示全部楼层
代码简单贴之,好过花半天时间去理解你的意思
发表于 2010-10-23 18:12:36 | 显示全部楼层
这代码是多窗口同步点击的?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-12 03:34 , Processed in 0.069504 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表