【问题标题】:How to Winwait for two windows simultaneously in AutoIt?如何在 AutoIt 中同时 Winwait 两个窗口?
【发布时间】:2011-03-29 17:25:43
【问题描述】:

我想知道WinWaitActive 是否可以同时用于WindowWithThisTitleWindowWithThatTitle。我正在执行一个命令,可能会有一个窗口告诉我连接失败或出现用户/密码对话框。

还有其他方法吗?

WinWaitActive("Title1", "", 5)
If(WinExists("Title1")) Then
 MsgBox(0, "", "Do something")
Else
 If(WinExists("Title2")) Then
  MsgBox(0, "", "Do something else")
 EndIf
EndIf

因为我不想让超时时间超过 15 秒。

【问题讨论】:

标签: windows wait autoit


【解决方案1】:

更简单的解决方案可能是在 WinWaitActive 中使用正则表达式标题,定义为 here

然后你会得到这样的东西:

$hWnd = WinWaitActive("[REGEXPTITLE:(WindowWithThisTitle|WindowWithThatTitle)]")

If WinGetTitle($hWnd) = "WindowWithThisTitle" then
    DoSomething()
Else
    DoSomethingElse()
EndIf

【讨论】:

  • 语法应该是:$hWnd = WinWaitActive("[REGEXPTITLE:.*WindowWithThisTitle.*|.*WindowWithThatTitle.*]")
【解决方案2】:

这样的事情怎么样。

$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 秒的超时时间,但您可以将其关闭,它会一直等待。

【讨论】:

  • 但是这个 WhileLoop 会导致一个 cpu 线程/核心以 100% 运行。我正在考虑使用 WinWaitActive(regex) 的解决方案,但我不知道如何创建具有 OR 运算符的正则表达式。任何想法? “别忘了投票!”是什么意思?顺便说一句?
  • sleep(5) - 或更多 - 将修复 cpu 问题,它是硬循环。 WinWaitActive() 不会执行多个目标,它的返回是一个简单的成功布尔值,因此您不能真正对其进行正则表达式。自从您开始使用堆栈溢出以来,您已经投票过一次。 StackOverflow 系统只有在人们投票时才真正起作用。如果问题或答案对您有帮助,您可以使用向上箭头图片投票或使用向下箭头向下投票。祝你好运,希望这对你有所帮助,你可以通过投票来证明这一点。
  • 我还没有将您的答案标记为“THE”答案,因为也许有人知道没有循环的方法。如果没有人可以提供更好的方法,我将等待一段时间,然后将其设置为答案。感谢您的帮助!
  • WinWaitActive() 也在该函数的代码中循环。我很难想象有任何方法可以在不循环程序(与事件驱动)上下文的情况下做这样的事情。我确信存在更好的方法来做到这一点,但这种方法也可能有一个循环。
  • 根据 AutoIt 官方文档 WinWaitActive, "The window is polled every 250 milliseconds or so."
【解决方案3】:

您可以将此函数用于两个窗口..

; #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

for more with examples

【讨论】:

    【解决方案4】:

    我对 autoit 和整个编程世界还很陌生,我也遇到了同样的困境。幸运的是,我想出了一个直接的方法来做到这一点:

    Do
    $var1 = 0
    If  WinGetState("Document Reference","")    Then
        $var1 = 1
    ElseIf  WinGetState("Customer Search","")   Then
        $var1 = 1
    EndIf
    Until $var1 = 1
    

    所以它会一直停留在循环中,直到找到窗口并将$var1 设置为1。可能有更简单的方法(我相信开发人员对此感到喘不过气来),但这对我来说已经足够了。

    【讨论】:

      【解决方案5】:

      您可以在其中创建带有 if 语句的无限 while 循环:

      #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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-25
        • 2014-08-22
        • 2016-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多