Dauerhafte GUI-Abfrage

  • Hi!

    Momentan bleibe ich immer an einem Problem hängen: Meine GUI wird nur in den Schleifen abgefragt, aber nicht in der Kernfunktion des Programmes (welches keine Schleife ist). Ich möchte jetzt, dass z.B. $GUI_EVENT_CLOSE an jeder zeile des programms ausgelesen wird und dann eben Exit aufgerufen wird.

    Beispiel:

    Spoiler anzeigen
    [autoit]

    GUICreate("Test", 358, 183, 193, 125)
    $ok = GUICtrlCreateButton("OK", 80, 56, 161, 81, 0)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $ok
    _funktion()
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _funktion() ;"Hauptfunktion"
    Beep(500, 50)
    Beep(500, 50) ;Während der Beeps soll die GUI abgefragt werden
    Beep(500, 50)
    Beep(500, 50)
    Beep(500, 50)
    Beep(500, 50)
    Beep(500, 50)
    Beep(500, 50)
    EndFunc

    [/autoit]

    Also praktisch wie HotKeySet(). Egal an welcher Position man ist, es springt immer an. Hoffe, ich konnte es halbwegs rüberbringen was ich will :|

    fabs

    Einmal editiert, zuletzt von fabs (2. August 2008 um 14:11)

  • deine Funktion ist aber schon wie ein HotKey.
    Zwei funktionen können niemals zur gleichen zeit ablaufen und das müssten sie ja wenn ein Ereignis kontrolliert werden soll während ein beep beept :D
    Die Funktion könnte frühstens direkt nach dem beep in Kraft treten.

    Selbst ein Hotkey würde den Beep-Befehl nich abbrechen, sondern erst genau danach einsetzen.

  • Das Beep-Zeugs ist ja nurn Beispiel. Es soll einfach immer nach den ausgeführten Beeps die GUI abgefragt werden.

  • also mit den includes funzt das doch? Ich lass die funktion laufen und drück auf X oder mach esc und das script beenden sich.

    Spoiler anzeigen

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    GUICreate("Test", 358, 183, 193, 125)
    $ok = GUICtrlCreateButton("OK", 80, 56, 161, 81, 0)
    GUISetState(@SW_SHOW)

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $ok
    _funktion()
    EndSwitch
    WEnd

    Func _funktion() ;"Hauptfunktion"
    Beep(500, 50)
    Beep(500, 50) ;Während der Beeps soll die GUI abgefragt werden
    Beep(500, 50)
    Beep(500, 50)
    Beep(500, 50)
    Beep(500, 50)
    Beep(500, 50)
    Beep(500, 50)
    EndFunc

    E: ups lag daran das die beeps so schnell vorbei sind :/

    Einmal editiert, zuletzt von Greek (2. August 2008 um 12:08)

  • Hi,
    wie gesagt 2 Schleifen können in AutoIt nicht nebeneinander laufen.

    Das einzigset was du dir mal anschauen könntest wäre AdlibEnable. Mit Adlibenable wird (z.B. alle 50 ms) eine Funktion aufgerufen wobei die andere Pausiert. Das müsste eigetnloich funktinieren ...

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUICreate("Test", 358, 183, 193, 125)
    $ok = GUICtrlCreateButton("OK", 80, 56, 161, 81, 0)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $ok
    _funktion()
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _funktion()
    AdlibEnable("_exit", 50)

    For $i = 1 To 1000
    Beep(500, 50)
    Next

    EndFunc ;==>_funktion

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit
    EndFunc ;==>_exit

    [/autoit]
    • Offizieller Beitrag

    @fabs: Wie schon richtig bemerkt wurde:

    Zwei funktionen können niemals zur gleichen zeit ablaufen


    Wenn du eine Funktion angestoßen hast, die noch nicht beendet ist, kann logischerweise ein GUI_EVENT_CLOSE in der Zeit nicht abgefragt werden.
    Du kannst mit AdlibEnable() sich ständig wiederholende Prozeduren ausführen, dann wird zwischenzeitlich auch das GUI_EVENT_CLOSE erfasst.
    Oder du setzt per AdlibEnable() eine Funktion in Gang mit Inhalt: ... If GUIGetMsg = $GUI_EVENT_CLOSE Then Exit ...
    Damit erzwingst du im vorgegeben Intervall die Abfrage.
    Mußt du sehen, was besser in deinen Ablauf paßt.

    Edit: tztz, da hab ich wohl zu langsam geschrieben, anno war schneller ;)

  • Mir ist schon klar warum und so. Aber genau sowas wie AdlibEnable() suche ich. Also könnte ich da dann als Befehl GUIGetMsg mit ner If ob die GUI geschlossen wurde reinbauen, und das wird nach jedem Befehl gemacht?
    Wenn ich das so richtig verstanden habe, könnte mir das jemand als Beispiel in die Funktion oben reinbauen? :rolleyes:

    edit:

    Spoiler anzeigen
    [autoit]

    #include<GUIConstantsEx.au3>
    #include<Misc.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $dll = DllOpen("user32.dll")

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("Test", 358, 183, 193, 125)
    $ok = GUICtrlCreateButton("OK", 80, 56, 161, 81, 0)
    GUISetState(@SW_SHOW)
    AdlibEnable("loop")

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $ok
    _funktion()
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _funktion() ;"Hauptfunktion"
    Beep(500, 50)
    Beep(500, 50) ;Während der Beeps soll die GUI abgefragt werden
    Beep(500, 50)
    Beep(500, 50)
    Beep(500, 50)
    Beep(500, 50)
    Beep(500, 50)
    Beep(500, 50)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func loop()
    If _IsPressed("0D", $dll) Then Exit
    EndFunc

    [/autoit]

    Perfekt. So wollte ich das. :D Danke Leute.

    Einmal editiert, zuletzt von fabs (2. August 2008 um 14:02)