2010-08-14 10 views
5

Chciałbym wiedzieć, czy możliwe jest jednoczesne "WinWaitActive" dla "WindowWithThisTitle" i "WindowWithThatTitle". Wykonuję polecenie i może być okno mówiące mi, że połączenie nie powiodło się lub pojawi się okno dialogowe użytkownika/przebiegu.Jak Winway uruchamiać jednocześnie dwa okna w AutoIt?

Czy istnieje inny sposób robienia tego w ten sposób?

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

Ponieważ nie chcę mieć limitu czasu, który może wynosić więcej niż 15 sekund.

Z góry dziękuję!

+0

Bardzo miło widzieć pytania AutoIt na StackOverflow! Nie zapomnij głosować! Zadawanie pytań i odpowiadanie na nie jest tylko częścią tego. – Copas

Odpowiedz

4

Co powiecie na coś takiego.

$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 

Bo nie chce mieć timeout który może być więcej niż 15 sekund.

Funkcja WinWaitActive() nie ma limitu czasu, chyba że zostanie podana. Dałeś mu pięciosekundowy limit czasu, ale możesz to zostawić i będzie to czekać na zawsze.

+0

Ale to WhileLoop powoduje, że jeden wątek/rdzeń procesora działa na poziomie 100%. Myślałem o rozwiązaniu z WinWaitActive (regex), ale nie wiem, jak utworzyć wyrażenie regularne, które ma operator OR. Dowolny pomysł? Co masz na myśli mówiąc "Nie zapomnij głosować!" btw? – MemphiZ

+0

Uśpienie (5) - lub więcej - naprawi problem z procesorem, to było trudne pętle. WinWaitActive() nie robi wielu celów, a jego powrót jest prostym boolem sukcesu, więc nie można go w rzeczywistości wyreperować. Głosowałeś raz, odkąd zacząłeś używać przepełnienia stosu. System StackOverflow działa tylko wtedy, gdy ludzie głosują. Jeśli pytanie lub odpowiedź jest dla ciebie przydatna, możesz zagłosować za pomocą strzałki w górę lub w dół za pomocą strzałki w dół. Powodzenia, mam nadzieję, że to pomogło, gdybyś mógł to pokazać poprzez głosowanie. – Copas

+0

Nie zaznaczałem jeszcze swojej odpowiedzi jako "THE", ponieważ może ktoś zna metodę bez pętli.Po prostu poczekam trochę czasu, a następnie ustawię go jako odpowiedź, jeśli nikt nie będzie w stanie zapewnić lepszej metody. Dzięki za pomoc! – MemphiZ

2

Można użyć tej funkcji do dwóch okien ..

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

Jestem dość nowy AutoIt i świat programowania w ogóle i miałem ten sam dylemat. Na szczęście nie zorientowali się prostą FWD sposób to zrobić:

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

Więc pozostanie w pętli, dopóki nie znajdzie się okno i ustawia $var1 do 1. Jest prawdopodobnie łatwiejsze sposoby (jestem pewien, że deweloperzy są bez tchu na to), ale jest to dla mnie wystarczająco proste.

4

Prostszym rozwiązaniem może być użycie tytuł REGEX w swojej WinWaitActive jak zdefiniowano tutaj: http://www.autoitscript.com/autoit3/docs/intro/windowsadvanced.htm

Można by potem mieć coś takiego:

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

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

można tworzyć nieskończone pętli while z czy oświadczenia tam:

#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 
Powiązane problemy