Rückgabewert WinWaitActive

  • Hallo Freunde der automatisierten Schritte,

    wird der Rückgabewert in @extended gespeichert?

    Falls ja, warum erhalte ich in folgendem Script 0, was für "Fehler" steht, obwohl Notepad aktiviert wurde?
    Ich hätte gerne - wie in der Hilfe steht - das Handle. Ist @extended dafür die falsche Variable?

    Spoiler anzeigen


    WinActivate("[CLASS:Notepad]", "") ; Fenster Notepad aktivieren
    WinWaitActive("[CLASS:Notepad]", "", 5) ; wartet x Sekunden, bis Notepad aktiv ist (Vordergrundfenster)


    If @extended = 0 Then
    MsgBox (0 , "Fehler", "@error = " & @error & " @extended = " & @extended)
    Else
    MsgBox (0 , "kein Fehler", "@error = " & @error & " @extended = " & @extended)
    EndIf


    ;~ WinWaitActive
    ;~ Unterbricht die Ausführung eines Skripts bis das angegebene Fenster aktiv ist.


    ;~ Rückgabewert
    ;~ Erfolg: Gibt das Handle des gewünschten Fensters zurück.
    ;~ Fehler: Gibt 0 zurück, wenn die maximale Unterbrechungszeit überschritten wurde.

    Viele Grüße
    AutoMit

  • Die Hilfe sagt:


    Zitat von Hilfe

    Return Value

    Success: a handle to the requested window.
    Failure: 0 if timeout occurred.

    kein grund hier @extended auszulesen.

    Grüße Yaerox

    Grüne Hölle

  • Vielen Dank.

    Bedeutet obiges, dass ich immer dann, wenn ich den in der Hilfe beschriebenen Rückgabewert über eine Variable abfragen möchte, dass ich dazu den Befehl in eine Variable packen muss wie hier:

    Local $iRetVal = WinWaitActive("[CLASS:Notepad]", "", 5)

    Oder gibt es eine allgemein gültige Variable, in der der Rückgabewert gespeichert ist, den es laut Hilfe gibt, wenn ich folgendes aufrufe?

    WinWaitActive("[CLASS:Notepad]", "", 5)

    (@extended scheint es nicht zu sein)

  • Es gibt keinen der immer zählt (soweit ich weiß).

    In der Hilfe steht meist genau was der Rückgabewert aussagt, und wenn nicht, ob @error und/oder @extended gesetzt werden. Sollte jetzt nur stehen Rückgabe 0 Fehler, 1 Erfolgreich, kann man ja sonst @error und @extended einfach trotzdem mal ausgeben lassen, falls es einige kleine Lücken in der Doku gibt.

    Grüße Yaerox

    Grüne Hölle

  • Und immer bei den Variablen daran denken, die letzte Funktion die diese setzt, muss nicht zwingend die sein, die direkt darüber steht ;)

    Wenn:

    Funktion1()
    If @error Then ...
    Funktion2()
    If @error Then ...

    Funktion 1 einen Fehler hat und @error setzt, und Funktion 2 nur mit einem Rückgabewert arbeitet, wird @error trotzdem bei dem zweiten auch ein Fehler aufzeigen ;)

    Grüße Yaerox

    Grüne Hölle

  • Funktion1()
    If @error Then ...
    Funktion2()
    If @error Then ...

    Funktion 1 einen Fehler hat und @error setzt, und Funktion 2 nur mit einem Rückgabewert arbeitet, wird @error trotzdem bei dem zweiten auch ein Fehler aufzeigen

    Ein interessanter Gedanke. Und wie kommt man aus dem Dilemma heraus?

  • Ich bin mir immer noch nicht hundert prozentig sicher, ob das wirklich so ist. Ändern würde sich das sofern du Funktionen aufrufst die mit SetError arbeiten und es ändern, oder der Aufruf richtig ist. Meist bedeutet @error ehh das Errorhandling vorliegen muss.

    Wollte das eigentlich in einem kleinem Workaround ausprobieren, suche noch eine Funktion die dafür gut geeignet ist...

    Grüße Yaerox

    Grüne Hölle

  • Es gibt kein Dilemma zu lösen - die Aussage ist falsch.
    @error und @extended werden bei jedem Funktionsaufruf zurückgesetzt.

    Er hat recht. hab grad ein Beispiel gefunden:

    AutoIt
    #include <File.au3>
    #include <MsgBoxConstants.au3>
    
    
    If Not _FileCreate("C:\Program Files\error.log") Then
        MsgBox($MB_SYSTEMMODAL, "Error", " Error Creating/Resetting log.      error:" & @error)
    	MsgBox(0, "", @error)
    EndIf

    Danke @AspirinJunkie

    Grüße Yaerox

    Grüne Hölle

  • Wenn du nicht sicher bist gibt es zwei Möglichkeiten die Unsicherheit zu beseitigen:

    • Lesen der Dokumentation: Zitat aus >>SetError<<:
      Code
      Wenn eine Funktion gestartet wird, wird @error auf 0 gesetzt.
    • Selbst testen:
  • Und wieder eine Lösung mehr :) Danke. Wenn man sich die Möglichkeiten mit Autoit ansieht, dürften die Gurus hier alle PC Arbeiten mit einem Handstreich erledigen ;)

  • Naja... AutoIt ist gut und schön, da es aber eine Scriptsprache ist, kannst du alles was auf Geschwindigkeit (große Datenmengen) geht, meist vergessen.
    Dafür kann man sich alleine den Epub-Reader von mir ansehen: EPUB/E-Book Verwaltung und Reader
    Das Laden von ~40000 Datensätzen (hab zum testen welche erstellt), dauert mit dem AutoIt-Programm ~30 sek., Allein das leeren der ListView dauert EWIG. (neu erstellen wäre schneller...).
    In QT (C++) geht das Laden in ~3 sekunden und das leeren der Listview merk ich nichtmal wirklich...
    (Ich bin mir natürlich bewusst, dass man mit Sicherheit beide Scripte noch optimieren kann ;), ist jetzt auch nur nen Beispiel.)