如何监测不确定的弹出窗口并予以关闭?[已解决]
本帖最后由 cashiba 于 2017-3-18 09:51 编辑现象:有个程序,在运行过程中,从登陆直到主界面出现,这个过程中,会不断的有提示窗口(错误提示或一些说明或一些通知等等之类的,并且每次运行不一定都是同样的提示),通常键击或直接可以关闭。
目标:为实现上述自动关闭提示窗口的过程,拟用循环检测方法,判断各个出现窗口(当前激活状态的窗口)的标题,如果与最后出现的主界面窗口标题不一样,就将其关闭。
疑问:语法好像没错误,就是代码运行不正常。是不是要用到多线程函数,另开一个平行线程以监测窗口?
以下代码只是为了说明问题,并不能正常运行。注:请不要运行,因为会陷入死循环。trastip("无标题 - 记事本");这个是循环判断无关的当前窗口并予以关闭的函数
sleep(3000)
Run("C:\Windows\System32\calc.exe")
Run("C:\Windows\System32\mspaint.exe")
Run("C:\Windows\System32\cmd.exe")
Run("C:\Windows\winhelp.exe")
;以上都是无关窗口,需要自动判断然后关闭。
;下面这个“无标题 - 记事本”窗口是最后出现的主界面。
Run("C:\Windows\notepad.exe");Run("C:\Windows\System32\notepad.exe")
Sleep(100)
Local $hWnd = WinWait("", "", 10)
WinActivate($hWnd)
Sleep(1000)
Func trastip($tip);
Local $Atip=WinGetTitle("")
local $AHnd=WinGetHandle("")
While 1=1
If $Atip<>$tip Then
consolewrite("当前活动窗口标题为:" & $Atip & @CRLF)
Sleep(1000)
WinClose($AHnd)
Else
ExitLoop
EndIf
WEnd
EndFunc
Func trastit($tip);另一种函数写法
Local $Atip=WinGetTitle("")
local $AHnd=WinGetHandle("")
Do
consolewrite("当前活动窗口标题为:" & $Atip & @CRLF)
Sleep(1000)
WinClose($AHnd)
until $Atip=$tip
Sleep(1000)
EndFunc 在按键里beginthread--pausethrea--killthread内置函数可以平行运行监测线程,发现弹出窗口就关闭之,比较方便。只是对弹出窗口的判断不准确,运行容易出错。所以想用AU3实现,发现也困难...... au3里没有多线程,只能再来个进程,专门监视,发现了就关闭,搞定。 $HwArr = WinList("提示")
If $HwArr>0 Then;发现弹出窗口则enter关闭之
$HwPop=$HwArr
ConsoleWrite($HwPop)
winActive($HwPop)
sleep(1000)
KeyPress("Enter", 1)
sleep(1500)
Else ;无弹窗则开始下一步
;下一步
endif
目前用这一段代码来关闭弹窗。只是:
1、运行不可靠,有时会出错
2、只能在估计可能有弹窗的步骤之后加这段代码,无法全程监控 MASK 有空看看 是IE弹出来的窗口么?
具体有哪些看看,标题应该差不多,直接关闭就好了。 本帖最后由 cashiba 于 2016-9-23 19:08 编辑
是IE弹出来的窗口么?
具体有哪些看看,标题应该差不多,直接关闭就好了。
1361739590 发表于 2016-9-23 14:31 http://www.autoitx.com/images/common/back.gif
不是IE,是第三方应用程序。在登陆使用过程中,会有不确定的各种弹出窗口,有的是错误提示,有的是运行状态提示,有的是即时说明...标题,文字都不一定相同。这些窗口一弹出来,不点确定或关闭就没法往下next。总之,要实现无人值守操作的关键是能够识别出是弹出窗口。
难点在于:
1、标题,文字都不一定相同
2、获取顶层窗口或当前激活窗口的方法好像也不靠谱。可能获取不到弹窗或者获取错误。
目前的思路是,分段关闭。比喻在A窗口(标题:AAA)出现后,直到B窗口(标题:BBB)出现,AB之间先后出现的的所有窗口都是弹窗,即只要标题不是AAA或BBB的都winClose。
下面这段代码只能关闭标题为like"提示"的弹窗,有局限,标题不是"提示"的可能会漏掉:$HwArr = WinList("提示")
If $HwArr>0 Then
$HwPop=$HwArr
ConsoleWrite($HwPop)
winActive($HwPop)
sleep(1000)
KeyPress("Enter", 1)
;将弹窗标题写入log文本
Else
;进入下一步
endif下面这段代码是循环获取当前活动窗口的标题,如果不是目标窗口"BBB",则关闭,直到"BBB"窗口出现。也不理想。
Local $ATitle=WinGetTitle("")
local $AHnd=WinGetHandle("")
While 1=1
If $ATitle<>"BBB" Then
Sleep(1000)
WinClose($AHnd)
Else
ExitLoop
EndIf
WEnd
或:
Local $ATitle=WinGetTitle("")
local $AHnd=WinGetHandle("")
Do
Sleep(1000)
WinClose($AHnd)
until $ATitle="BBB"
页:
[1]