找回密码
 加入
搜索
查看: 4417|回复: 6

[AU3基础] 如何监测不确定的弹出窗口并予以关闭?[已解决]

  [复制链接]
发表于 2016-9-16 16:00:03 | 显示全部楼层 |阅读模式
本帖最后由 cashiba 于 2017-3-18 09:51 编辑

现象:有个程序,在运行过程中,从登陆直到主界面出现,这个过程中,会不断的有提示窗口(错误提示或一些说明或一些通知等等之类的,并且每次运行不一定都是同样的提示),通常键击[enter]或直接可以关闭。
目标:为实现上述自动关闭提示窗口的过程,拟用循环检测方法,判断各个出现窗口(当前激活状态的窗口)的标题,如果与最后出现的主界面窗口标题不一样,就将其关闭。

疑问:语法好像没错误,就是代码运行不正常。是不是要用到多线程函数,另开一个平行线程以监测窗口?

以下代码只是为了说明问题,并不能正常运行。注:请不要运行,因为会陷入死循环。
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("[CLASS:Notepad]", "", 10)
WinActivate($hWnd)
Sleep(1000)

Func trastip($tip);
Local $Atip=WinGetTitle("[active]")
local $AHnd=WinGetHandle("[active]")
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("[active]")
local $AHnd=WinGetHandle("[active]")
Do
consolewrite("当前活动窗口标题为:" & $Atip & @CRLF)
Sleep(1000)
WinClose($AHnd)
until $Atip=$tip
Sleep(1000)
EndFunc
 楼主| 发表于 2016-9-18 10:04:53 | 显示全部楼层
在按键里beginthread--pausethrea--killthread内置函数可以平行运行监测线程,发现弹出窗口就关闭之,比较方便。只是对弹出窗口的判断不准确,运行容易出错。所以想用AU3实现,发现也困难......
发表于 2016-9-19 00:00:48 | 显示全部楼层
au3里没有多线程,只能再来个进程,专门监视,发现了就关闭,搞定。
 楼主| 发表于 2016-9-21 22:55:35 | 显示全部楼层
$HwArr = WinList("提示")
       If $HwArr[0][0]>0 Then  ;发现弹出窗口则enter关闭之
          $HwPop=$HwArr[1][1]
          ConsoleWrite($HwPop)
          winActive($HwPop)
          sleep(1000)
          KeyPress("Enter", 1)
          sleep(1500)
       Else                                ;无弹窗则开始下一步
            ;下一步
       endif

目前用这一段代码来关闭弹窗。只是:
1、运行不可靠,有时会出错
2、只能在估计可能有弹窗的步骤之后加这段代码,无法全程监控
发表于 2016-9-22 13:18:26 | 显示全部楼层
MASK 有空看看
发表于 2016-9-23 14:31:04 | 显示全部楼层
是IE弹出来的窗口么?
具体有哪些看看,标题应该差不多,直接关闭就好了。
 楼主| 发表于 2016-9-23 19:04:18 | 显示全部楼层
本帖最后由 cashiba 于 2016-9-23 19:08 编辑
是IE弹出来的窗口么?
具体有哪些看看,标题应该差不多,直接关闭就好了。
1361739590 发表于 2016-9-23 14:31

不是IE,是第三方应用程序。在登陆使用过程中,会有不确定的各种弹出窗口,有的是错误提示,有的是运行状态提示,有的是即时说明...标题,文字都不一定相同。这些窗口一弹出来,不点确定或关闭就没法往下next。总之,要实现无人值守操作的关键是能够识别出是弹出窗口。
难点在于:
1、标题,文字都不一定相同
2、获取顶层窗口或当前激活窗口的方法好像也不靠谱。可能获取不到弹窗或者获取错误。

目前的思路是,分段关闭。比喻在A窗口(标题:AAA)出现后,直到B窗口(标题:BBB)出现,AB之间先后出现的的所有窗口都是弹窗,即只要标题不是AAA或BBB的都winClose。  
下面这段代码只能关闭标题为like"提示"的弹窗,有局限,标题不是"提示"的可能会漏掉:
$HwArr = WinList("提示")
       If $HwArr[0][0]>0 Then
          $HwPop=$HwArr[1][1]
          ConsoleWrite($HwPop)
          winActive($HwPop)
          sleep(1000)
          KeyPress("Enter", 1)
          ;将弹窗标题写入log文本
       Else
          ;进入下一步
       endif
下面这段代码是循环获取当前活动窗口的标题,如果不是目标窗口"BBB",则关闭,直到"BBB"窗口出现。也不理想。
Local $ATitle=WinGetTitle("[active]")
local $AHnd=WinGetHandle("[active]")
While 1=1
If $ATitle<>"BBB" Then
Sleep(1000)
WinClose($AHnd)
Else
ExitLoop
EndIf
WEnd

或:
Local $ATitle=WinGetTitle("[active]")
local $AHnd=WinGetHandle("[active]")
Do
Sleep(1000)
WinClose($AHnd)
until $ATitle="BBB"
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-25 22:13 , Processed in 0.073827 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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