Windows 如何在AutoIt中同时等待两个窗口?
我想知道是否可以同时为“带此标题的窗口”和“带此标题的窗口”设置“WinWaitActive”。我正在执行一个命令,可能会有一个窗口告诉我连接失败,或者出现一个用户/过程对话框 有没有其他方法可以这样做Windows 如何在AutoIt中同时等待两个窗口?,windows,wait,autoit,Windows,Wait,Autoit,我想知道是否可以同时为“带此标题的窗口”和“带此标题的窗口”设置“WinWaitActive”。我正在执行一个命令,可能会有一个窗口告诉我连接失败,或者出现一个用户/过程对话框 有没有其他方法可以这样做 WinWaitActive("Title1", "", 5) If(WinExists("Title1")) Then MsgBox(0, "", "Do something") Else If(WinExists("Title2")) Then MsgBox(0, "", "Do so
WinWaitActive("Title1", "", 5)
If(WinExists("Title1")) Then
MsgBox(0, "", "Do something")
Else
If(WinExists("Title2")) Then
MsgBox(0, "", "Do something else")
EndIf
EndIf
因为我不想超时超过15秒
提前谢谢 像这样的怎么样
$stillLooking = True
While $stillLooking
$activeWindowTitle = WinGetTitle(WinActive(""))
If $activeWindowTitle == "Title1" Then
MsgBox(0, "", "Do something")
$stillLooking = False
ElseIf $activeWindowTitle == "Title2" Then
MsgBox(0, "", "Do something else")
$stillLooking = False
EndIf
sleep(5)
WEnd
因为我不想拥有这个世界
超时时间可能超过15秒
秒
WinWaitActive()没有超时,除非指定超时。您给了它5秒钟的超时时间,但您可以将其关闭,它将永远等待。您可以在两个窗口中使用此功能
; #FUNCTION# ====================================================================================================================
; Name...........: _2WinWait
; Description ...: Wait For Tow Windows .
; Syntax.........: _2WinWait ($FirstTitle,$SecondTitle,[$FirstText = "" ,[$SecondText = ""]] )
; Parameters ....: $FirstTitle - Title Of First Wondow
; $SecondTitle - Title Of Second Wondow
; $FirstText - Text Of First Wondow
; $SecondText - Text Of Second Wondow
; Return values .: Success - None
; Failure - Returns a 0 => If Your Titles Is Wrong
; Author ........: Ashalshaikh : Ahmad Alshaikh
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; No
; ===============================================================================================================================
Func _2WinWait ($FirstTitle,$SecondTitle,$FirstText = "" ,$SecondText = "" )
If $FirstTitle = "" Or $SecondTitle = "" Then
Return 0
Else
Do
Until WinExists ($FirstTitle,$FirstText) Or WinExists ($SecondTitle,$SecondText)
EndIf
EndFunc
; #FUNCTION# ====================================================================================================================
; Name...........: _2WinWait_Any
; Description ...: Wait For Tow Windows And Return Any Window Id Exists .
; Syntax.........: _2WinWait_Any ($FirstTitle,$SecondTitle,[$FirstText = "" ,[$SecondText = ""]] )
; Parameters ....: $FirstTitle - Title Of First Wondow
; $SecondTitle - Title Of Second Wondow
; $FirstText - Text Of First Wondow
; $SecondText - Text Of Second Wondow
; Return values .: Success - Number Of Window ==> 1= First Window , 2= Second Window
; Failure - Returns a 0 => If Your Titles Is Wrong
; Author ........: Ashalshaikh : Ahmad Alshaikh
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; No
; ===============================================================================================================================
Func _2WinWait_Any ($FirstTitle,$SecondTitle,$FirstText = "" ,$SecondText = "" )
If $FirstTitle = "" Or $SecondTitle = "" Then
Return 0
Else
Do
Until WinExists ($FirstTitle,$FirstText) Or WinExists ($SecondTitle,$SecondText)
If WinExists ($FirstTitle,$FirstTexit) Then
Return 1
Else
Return 2
EndIf
EndIf
EndFunc
我对autoit和编程界基本上是个新手,我也遇到了同样的困境。幸运的是,我想出了一个直截了当的方法:
Do
$var1 = 0
If WinGetState("Document Reference","") Then
$var1 = 1
ElseIf WinGetState("Customer Search","") Then
$var1 = 1
EndIf
Until $var1 = 1
因此,它将留在循环中,直到找到窗口并将
$var1
设置为1。可能有更简单的方法(我确信开发人员对此感到惊讶),但这对我来说已经足够简单了。一个更简单的解决方案可能是在WinWaitActive
中使用正则表达式标题,定义如下:
然后你会有这样的东西:
$hWnd = WinWaitActive("[REGEXPTITLE:(WindowWithThisTitle|WindowWithThatTitle)]")
If WinGetTitle($hWnd) = "WindowWithThisTitle" then
DoSomething()
Else
DoSomethingElse()
EndIf
您可以创建一个无限while循环,其中包含if语句:
#include <MsgBoxConstants.au3>
Example()
Func Example()
While 1
; Test if the window exists and display the results.
If WinExists("Windows Security") Then
Local $hWnd = WinWaitActive("Windows Security", "", 2000)
ControlSetText($hWnd, "", "[CLASS:Edit; INSTANCE:1]", "hel233")
ControlClick("Windows Security","","[CLASS:Button; INSTANCE:2]")
Sleep(5000)
EndIf
; Test if the window exists and display the results.
If WinExists("Spread the Word") Then
'The line below will wait until the window is active, but we don't need that
'Local $hWnd = WinWaitActive("Spread the Word", "", 2000)
WinClose("Spread the Word")
Sleep(5000)
EndIf
wend
EndFunc
#包括
示例()
Func示例()
而1
; 测试窗口是否存在并显示结果。
如果WinExists(“Windows安全”),则
本地$hWnd=WinWaitActive(“Windows安全性”,2000年)
ControlSetText($hWnd,“,”[CLASS:Edit;INSTANCE:1],“hel233”)
ControlClick(“Windows安全性”、“类:按钮;实例:2]”)
睡眠(5000)
恩迪夫
; 测试窗口是否存在并显示结果。
如果Wine存在(“传播信息”),那么
下面的行将等待窗口处于活动状态,但我们不需要这样做
'Local$hWnd=WinWaitActive(“传播信息”,“”,2000)
温克洛斯(“传播信息”)
睡眠(5000)
恩迪夫
温德
EndFunc
很高兴在StackOverflow上看到AutoIt问题!别忘了投票!提问和回答只是其中的一部分,但这会导致一个cpu线程/内核以100%的速度运行。我正在考虑使用WinWaitActive(regex)的解决方案,但我不知道如何创建具有OR运算符的regex。有什么想法吗?顺便说一句,你说的“别忘了投票”是什么意思?睡眠(5个或更多)将解决cpu问题,这是硬循环。WinWaitActive()不会执行多个目标,它的返回是一个简单的成功bool,因此您不能真正地对其进行正则化。自从开始使用堆栈溢出以来,您已经投票过一次。StackOverflow系统只有在人们投票时才有效。如果某个问题或答案对您有帮助,您可以使用向上箭头图片向上或向下箭头进行投票。祝你好运,希望这对你有所帮助。你可以通过投票来证明这一点。我还没有将你的答案标记为“正确”答案,因为可能有人知道一种没有循环的方法。如果没有人能提供更好的方法,我将等待一段时间,然后将其设置为答案。谢谢你的帮助!WinWaitActive()还会在该函数的代码中循环。我很难想象有什么方法可以不在程序(与事件驱动)环境中循环地做这样的事情。我确信有一种更好的方法可以做到这一点,但这种方法也可能有一个循环。根据WinWaitActive
的官方AutoIt文档,synax应该是:$hWnd=WinWaitActive(“[REGEXPTITLE:.*windowwiththisttitle.|.*windowwiththisttitle.*)”