2010-08-14 41 views
5

Tôi muốn biết nếu có thể "WinWaitActive" cho "WindowWithThisTitle" và "WindowWithThatTitle" cùng một lúc. Tôi đang thực hiện một lệnh và có thể có một cửa sổ nói với tôi rằng kết nối không thành công hoặc hộp thoại người dùng/vượt qua sắp xuất hiện.Làm thế nào để Winwait cho hai cửa sổ cùng một lúc trong AutoIt?

Có cách nào khác để thực hiện điều này không?

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

Vì tôi không muốn có thời gian chờ có thể dài hơn 15 giây.

Cảm ơn trước!

+0

Rất vui khi thấy các câu hỏi AutoIt trên StackOverflow! Đừng quên bỏ phiếu! Đặt câu hỏi và trả lời chúng chỉ là một phần của nó. – Copas

Trả lời

4

Làm thế nào về điều này.

$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 

Bởi vì tôi không muốn có timeout mà có thể là hơn 15 giây.

WinWaitActive() không có thời gian chờ trừ khi bạn chỉ định. Bạn đã cho nó một thời gian chờ năm giây nhưng bạn có thể rời khỏi đó và nó sẽ chờ đợi mãi mãi.

+0

Nhưng ThisLoop này làm cho một luồng/lõi CPU chạy ở 100%. Tôi đã suy nghĩ về một giải pháp với WinWaitActive (regex) nhưng tôi không biết làm thế nào để tạo ra một regex có một nhà điều hành OR. Bất kỳ ý tưởng? Ý của bạn là "Đừng quên bỏ phiếu!" btw? – MemphiZ

+0

Giấc ngủ (5) - hoặc nhiều hơn - sẽ khắc phục vấn đề cpu, nó là một vòng lặp cứng. WinWaitActive() sẽ không làm nhiều mục tiêu và sự trở lại của nó là một bool thành công đơn giản, do đó bạn không thể thực sự regex nó. Bạn đã bỏ phiếu một lần kể từ khi bạn bắt đầu sử dụng tràn ngăn xếp. Hệ thống StackOverflow thực sự chỉ hoạt động nếu mọi người bỏ phiếu. Nếu câu hỏi hoặc câu trả lời hữu ích cho bạn, bạn có thể bỏ phiếu bằng hình ảnh mũi tên lên hoặc xuống bằng mũi tên xuống. Chúc may mắn, hy vọng điều này đã giúp ích nếu bạn có thể cho rằng bằng cách bỏ phiếu. – Copas

+0

Tôi chưa đánh dấu câu trả lời của bạn là câu trả lời "THE" vì có thể ai đó biết phương thức mà không lặp.Tôi sẽ chờ một chút thời gian và sau đó đặt nó là câu trả lời nếu không ai có thể cung cấp một cách tốt hơn. Cảm ơn bạn đã giúp đỡ! – MemphiZ

2

Bạn có thể sử dụng chức năng này cho hai cửa sổ ..

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

0

Tôi khá mới để AutoIt và thế giới lập trình nói chung và tôi đã cùng tiến thoái lưỡng nan này. May mắn tôi đã tìm ra một cách Fwd thẳng để làm điều đó:

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

Vì vậy, nó sẽ ở lại trong vòng lặp cho đến khi nó tìm thấy các cửa sổ và đặt $var1 để 1. Có cách có lẽ dễ dàng hơn (Tôi chắc chắn nhà phát triển đang thở hổn hển ở đây) nhưng điều này là thẳng fwd đủ cho tôi.

4

Một giải pháp đơn giản có thể được sử dụng một tiêu đề REGEX trong WinWaitActive của bạn như định nghĩa ở đây: http://www.autoitscript.com/autoit3/docs/intro/windowsadvanced.htm

Sau đó, bạn sẽ có một cái gì đó như thế này:

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

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

Bạn có thể tạo vô hạn trong khi vòng lặp với nếu tuyên bố trong đó:

#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 
Các vấn đề liên quan