主要的问题:比如当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 编辑 ] |