Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何在AutoIt中同时等待两个窗口?_Windows_Wait_Autoit - Fatal编程技术网

Windows 如何在AutoIt中同时等待两个窗口?

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”。我正在执行一个命令,可能会有一个窗口告诉我连接失败,或者出现一个用户/过程对话框

有没有其他方法可以这样做

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.*)”