button soll 5 sekunden lang gedrückt bleiben um erst dann eine Funktion zu starten

  • Hey.

    Ich habe einen Button, der eine ziemlich "sensible" Funktion ausführt. Wenn ich nun aus versehen diesen Button klicke, kann das "unangenehme" Folgen nach sich ziehen.
    Jetzt könnte man sagen: "Bau doch eine zusätzliche Abfrage als Sicherheit rein, ob du das wirklich machen willst..."

    Ja, daran hab ich schon gedacht. Aber dem fehlt jegliche "Rafinesse". Wie löse ich das denn ab besten?

    Spoiler anzeigen
    [autoit]

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

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

    Global $gui = GUICreate("test")
    Global $btn = GUICtrlCreateButton("testbutton",10,10)
    Global $countertime = 1000
    GUISetState(@SW_SHOW)

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

    While 1
    $nmsg = GUIGetMsg($gui)
    Select
    Case $nmsg = $GUI_EVENT_CLOSE
    Exit
    Case $nmsg = $btn
    buttoncounter(4)
    ;~ buttoncounter2(4)
    EndSelect
    WEnd

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

    ; diese Funktion funktioniert nicht!
    Func buttoncounter($count)
    $i = 0
    While $i <= $count
    Sleep($countertime)
    $nmsg2 = GUIGetMsg($gui)
    Select
    Case $nmsg2 = $btn
    $i = $i + 1
    EndSelect
    WEnd
    If $i = $count Then MsgBox(0, "", "jetzt wird die funktion hoffentlich nur einmal gestartet")
    EndFunc

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

    ;und diese Funktion klappt auch nicht!
    Func buttoncounter2($count)
    $dll = DllOpen("user32.dll")
    $i = 0
    While _IsPressed("01", $dll)
    Sleep($countertime)

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

    If $i = $count Then
    MsgBox(0, "", "jetzt wird die funktion hoffentlich nur einmal gestartet")
    ExitLoop
    EndIf

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

    $i = $i + 1
    WEnd
    DllClose($dll)
    EndFunc

    [/autoit]

    Hab diese Schleifen auch schon mit "Do ... until" und "For ... Next" versucht, aber nix klappt.

    Kann mir jemand weiterhelfen?
    MfG Lottich

  • Extrem hässlich, aber geht:

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>
    Opt("MouseCoordMode",2)
    $dll="user32.dll"
    GUICreate("")
    $button = GUICtrlCreateButton("5 seconds flat",0,0,150,30)
    GUISetState()
    While 1
    Switch _IsPressed("01",$dll)
    Case True
    $mgp = MouseGetPos()
    If $mgp[0] >= 0 And $mgp[0] <= 150 And $mgp[1] >= 0 And $mgp[1] <= 30 Then
    If _waitforSeconds(5) Then MsgBox(0,"","Funktion ausführen")
    EndIf
    Case False
    Sleep(50)
    EndSwitch
    WEnd

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

    Func _waitforSeconds($seconds)
    $ms = $seconds * 1000
    $timer = TimerInit()
    Do
    If not _IsPressed("01",$dll) then return False
    Until TimerDiff($timer) >= $ms
    If _IsPressed("01",$dll) Then Return True
    Return False
    EndFunc

    [/autoit]


    edit: Eigentlich müsste das wohl gehen, indem du einen Hook auf das Event setzt, was eintritt, wenn man einen Button runterdrückt (normal kann man darauf nicht reagieren, sondern nur darauf, dass der Button wieder losgelassen wird)

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

  • Hier noch eine Variante mit dem OnEventMode:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    Opt("GUIOnEventMode", 1)

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

    GUICreate("test")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_TestButton")
    Global $btn = GUICtrlCreateButton("testbutton",10,10)
    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(10)
    WEnd

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

    Func _TestButton()
    $timer = TimerInit()
    While 1
    Sleep(100)
    $aCursorInfo = GUIGetCursorInfo()
    If $aCursorInfo[2] And $aCursorInfo[4] = $btn Then
    If TimerDiff($timer) > 5000 Then ExitLoop
    Else
    Return
    EndIf
    ConsoleWrite(TimerDiff($timer) & @CRLF) ; Nur zum Testen, dass es auch wirklich läuft
    WEnd
    MsgBox(0, "", "jetzt wird die funktion hoffentlich nur einmal gestartet")
    EndFunc

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

    Func _exit()
    Exit
    EndFunc

    [/autoit]
  • hey Leviathan

    Auf den ersten Blick funktioniert das. Leider hat sich herausgestellt, dass diese Methode verbuggt ist.
    Klickt man nur kurz auf den Button hängt sich die GUI auf. Man kann dann zwar immer noch den Button geklickt halten und die Testmessage (als funktionsersatz) erscheint,
    aber es funzt dann nix anderes mehr. GUI kann nicht normal geschlossen werden und andere Buttons funktionieren auch nicht mehr.

  • Das scheint die Lösung! Die GUI hängt sich nicht auf und selbst wenn ich den Button nur kurz klicke kann ich noch andere Buttons klicken. Danke für diesen Post. :thumbup:

  • Hier dann noch ne Version ohne Mausabfrage:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GuiButton.au3>
    Opt("GUIOnEventMode", 1)

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

    GUICreate("test")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_GUI_EVENT_PRIMARYDOWN")
    Global $btn = GUICtrlCreateButton("testbutton",10,10)
    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(100)
    WEnd

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

    Func _GUI_EVENT_PRIMARYDOWN()
    $timer = TimerInit()
    While 1
    Sleep(100)
    If BitAND(_GUICtrlButton_GetState($btn), $BST_PUSHED) = $BST_PUSHED Then
    If TimerDiff($timer) > 5000 Then ExitLoop
    Else
    Return
    EndIf
    ConsoleWrite(TimerDiff($timer) & @CRLF) ; Nur zum Testen, dass es auch wirklich läuft
    WEnd
    MsgBox(0, "", "jetzt wird die funktion hoffentlich nur einmal gestartet")
    EndFunc

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

    Func _exit()
    Exit
    EndFunc

    [/autoit]

  • Jetzt könnte man sagen: "Bau doch eine zusätzliche Abfrage als Sicherheit rein, ob du das wirklich machen willst..."

    Ja, daran hab ich schon gedacht. Aber dem fehlt jegliche "Rafinesse". Wie löse ich das denn ab besten?

    Naja was sagt dir an solch einer Lösung denn nicht zu? Ging es nur darum dass dir nicht klar war wie man solch eine Abfrage realisiert (per msgbox oder zweiter eigener GUI...) oder gefiel dir das nur nicht? Ganz ehrlich ich als Benutzer eines Programmes bin eher eine msgbox Abfrage gewohnt, welche mich nochmals auf die Gefahren einer bestimmten Funktion hinweist, als irgendeinen Button 5 Sekunden gedrückt halten zu müssen. Diese Lösung mag zwar nett sein, ist aber letzten Endes wenig Anwenderfreundlich und dauert länger als einfach kurz ein zweites mal auf "ja ich will" zu klicken.

    Eine Lösung ohne msgbox Abfrage könnte im übrigen auch so ausschauen:

    Checkbox die man ankreuzen muss, vergleichbar mit dem bestätigen einer AGB in Onlineshops. Nur wenn die Checkbox angekreuzt ist wird der zugehörige Button aktiviert und kann angeklickt werden. Ist die Checkbox nicht angekreuzt bleibt der Button ausgegraut, also inaktiv und nicht klickbar.

    • Offizieller Beitrag
    Spoiler anzeigen
    [autoit]

    #Region - Timestamp
    ; 2012-04-08 12:26:10
    #EndRegion

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

    #include <GUIConstantsEx.au3>
    Opt("GUIOnEventMode", 1)
    Global $Timer
    GUICreate("test")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_GUI_EVENT_PRIMARYDOWN")
    GUISetOnEvent($GUI_EVENT_PRIMARYUP, "_GUI_EVENT_PRIMARYUP")
    Global $btn = GUICtrlCreateButton("5 Sekunden Drücken", 10, 10)
    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(100)
    WEnd

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

    Func _GUI_EVENT_PRIMARYDOWN()
    $Timer = TimerInit()
    EndFunc ;==>_GUI_EVENT_PRIMARYDOWN

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

    Func _GUI_EVENT_PRIMARYUP()
    If TimerDiff($Timer) > 5000 Then MsgBox(0, "Info", "Der Button war 5 Sekunden oder länger gedrückt")
    EndFunc ;==>_GUI_EVENT_PRIMARYUP
    Func _exit()
    Exit
    EndFunc ;==>_exit

    [/autoit]
  • Naja was sagt dir an solch einer Lösung denn nicht zu? Ging es nur darum dass dir nicht klar war wie man solch eine Abfrage realisiert (per msgbox oder zweiter eigener GUI...) oder gefiel dir das nur nicht? Ganz ehrlich ich als Benutzer eines Programmes bin eher eine msgbox Abfrage gewohnt, welche mich nochmals auf die Gefahren einer bestimmten Funktion hinweist, als irgendeinen Button 5 Sekunden gedrückt halten zu müssen. Diese Lösung mag zwar nett sein, ist aber letzten Endes wenig Anwenderfreundlich und dauert länger als einfach kurz ein zweites mal auf "ja ich will" zu klicken.

    Eine Lösung ohne msgbox Abfrage könnte im übrigen auch so ausschauen:

    Checkbox die man ankreuzen muss, vergleichbar mit dem bestätigen einer AGB in Onlineshops. Nur wenn die Checkbox angekreuzt ist wird der zugehörige Button aktiviert und kann angeklickt werden. Ist die Checkbox nicht angekreuzt bleibt der Button ausgegraut, also inaktiv und nicht klickbar.


    Hi Misterspeed,

    wie ich sowas mit einer 2. GUI oder einer Messagebox realisieren kann weiss ich durchaus. Aber auf Arbeit müssen wir in einem Programm arbeiten bei dem es solch einen Button gibt und ich finde diese Lösung hervorragend.
    Das mit der Checkbox halte ich mir bereits in Reserve, falls das mit dem gedrückt halten nicht funktionieren wird. ;)

    Raupi
    Hey,

    danke für deinen Code. Den werd ich auch auf jeden Fall testen.

    Spoiler anzeigen

    Momentan fehlt mir leider die Zeit, weil ich gleich weg muss, aber heute Abend werd ich die Tests durchführen.


    MfG Lottich

    • Offizieller Beitrag
    Zitat von peethebee

    Raupi : Sieht sauber aus, aber ich glaube, man sollte in PRIMARYUP den Timer noch auf einen ungültigen Wert und dagegen auch prüfen. Sonst kann man im Abstand von mehr als 5 Sekunden zweimal kurz klicken und es müsste ausgelöst werden…

    Bei jedem PrimaryDown wird der Timer neu gesetzt, also kann zweimal kurz klicken nicht zum Ziel führen. ;)
    Man könnte noch abfragen woher der Klick kommt, braucht man aber bei 1 Button nicht.
    Wenn ich später Langeweile habe, werde ich das noch einfügen. :D

    Editr: Bei dem Beispiel wird nur der 1. Button nach 5 Sekunden drücken abgefragt:

    Spoiler anzeigen
    [autoit]

    #region - Timestamp
    ; 2012-04-08 12:26:10
    #endregion - Timestamp

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

    #include <GUIConstantsEx.au3>
    Opt("GUIOnEventMode", 1)
    Global $Timer
    GUICreate("test")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_GUI_EVENT_PRIMARYDOWN")
    GUISetOnEvent($GUI_EVENT_PRIMARYUP, "_GUI_EVENT_PRIMARYUP")
    Global $btn = GUICtrlCreateButton("5 Sekunden Drücken", 10, 10, 200, 21)
    GUICtrlSetOnEvent(-1, "Button1")
    Global $btn2 = GUICtrlCreateButton("Button hat keine 5 Sekunden abfrage", 10, 40, 300, 21)
    GUICtrlSetOnEvent(-1, "Button2")
    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(100)
    WEnd

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

    Func _GUI_EVENT_PRIMARYDOWN()
    Local $aMouse = GUIGetCursorInfo()
    If IsArray($aMouse) Then; Dient nur um Fehler abzufangen
    If $aMouse[2] = 1 And $aMouse[4] = $btn Then; Primäre Maustaste wurde gedrückt und Cursor ist über Button 1
    $Timer = TimerInit(); Timer initialisieren
    ConsoleWrite("TimerInit, Button1 wurde gedückt" & @LF)
    Else; Cursor war nicht auf Button 1
    $Timer = 0
    ConsoleWrite("Button1 wurde nicht gedrückt, Timer zurücksetzen" & @LF)
    EndIf
    EndIf
    EndFunc ;==>_GUI_EVENT_PRIMARYDOWN

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

    Func _GUI_EVENT_PRIMARYUP()
    $Timer = 0
    EndFunc ;==>_GUI_EVENT_PRIMARYUP
    Func Button1()
    If TimerDiff($Timer) > 5000 Then
    MsgBox(0, "Info", "Button wurde 5 SEkunden oder länger gedückt")
    Else
    ConsoleWrite("Button1 wurde kürzer als 5 Sekunden gedückt" & @LF)
    $Timer = 0
    EndIf

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

    EndFunc ;==>Button1
    Func Button2()
    MsgBox(0, "Info", "Button 2 wurde gedrückt" & @CRLF & "Aktueller Timerwert: " & $Timer, 1)
    EndFunc ;==>Button2
    Func _exit()
    Exit
    EndFunc ;==>_exit

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Hey all,

    Ich habe jetzt alle Funktionen getestet. Sie funktionieren alle gut.
    Vielen Dank nochmals, dass ihr euch für dieses Problem begeistern konntet.

    Letztendlich hab ich mich für die 2. Variante von K4z entschieden, denn diese ließ sich für mich am besten bearbeiten.
    Denn das Programm, wo dieser Button eingesetzt werden soll, läuft nicht im "OnEventMode".
    Von diesem Mode hab ich mich schon vor langer Zeit losgelöst, denn ich arbeite fast nur noch mit Funktionen (die ich selber anlege), die mit Parametern gestartet werden.
    Und ihr wisst ja, dass sich "OnEventMode" nicht mit "GUIGetMsg" verträgt.

    Über Trick 17 hab ich es nun hinbekommen, dass der Button auch für "GUIGetMsg" funktioniert, allerdings nur mit nem Doppelklick, wobei dann der 2. Klick gehalten werden muss.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GuiButton.au3>

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

    Global $gui = GUICreate("test")
    Global $btn1 = GUICtrlCreateButton("5 sek gedrückt halten",0,0)
    Global $btn2 = GUICtrlCreateButton("test",0,50)
    GUISetState(@SW_SHOW)

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

    Func _GUI_EVENT_PRIMARYDOWN()
    Local $button_to_countdown = $btn1
    While 1
    Sleep(100)
    If BitAND(_GUICtrlButton_GetState($button_to_countdown), $BST_PUSHED) = $BST_PUSHED Then
    $timer = TimerInit()
    While 1
    Sleep(100)
    If BitAND(_GUICtrlButton_GetState($button_to_countdown), $BST_PUSHED) = $BST_PUSHED Then
    If TimerDiff($timer) > 5000 Then ExitLoop
    Else
    Return
    EndIf
    ConsoleWrite(TimerDiff($timer) & @CRLF) ; Nur zum Testen, dass es auch wirklich läuft
    WEnd
    _disableOnEvent()
    MsgBox(0, "", "jetzt wird die funktion hoffentlich nur einmal gestartet")
    Else
    _disableOnEvent()
    ExitLoop
    EndIf
    WEnd
    EndFunc

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

    Func _enableOnEvent() ; aktiviert die Option "OnEventMode"
    Opt("GUIOnEventMode", 1)
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_GUI_EVENT_PRIMARYDOWN")
    EndFunc

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

    Func _disableOnEvent() ; deaktiviert die Option "OnEventMode"
    Opt("GUIOnEventMode", 0)
    GUISetState()
    EndFunc

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

    While 1
    $nmsg = GUIGetMsg($gui)
    Select
    Case $nmsg = $GUI_EVENT_CLOSE
    Exit
    Case $nmsg = $btn1
    _enableOnEvent()
    _GUI_EVENT_PRIMARYDOWN()
    Case $nmsg = $btn2
    MsgBox(0,"","test")
    EndSelect
    WEnd

    [/autoit]

    Jetzt meine Frage:
    Ist der Code so okay und/oder kann man den noch verschönern?

    MfG Lottich

    • Offizieller Beitrag

    Das obige Script von dir ist reiner Murks, das funzt niemals.

    Spoiler anzeigen
    [autoit]

    #region - Timestamp
    ; 2012-04-09 00:19:31
    #endregion - Timestamp
    #include <GUIConstantsEx.au3>
    #include <GuiButton.au3>
    Global $Timer
    Global $gui = GUICreate("test")
    Global $btn1 = GUICtrlCreateButton("5 sek gedrückt halten", 0, 0)
    Global $btn2 = GUICtrlCreateButton("test", 0, 50)
    GUISetState(@SW_SHOW)
    While 1
    $nmsg = GUIGetMsg($gui)
    Select
    Case $nmsg = $GUI_EVENT_CLOSE
    Exit
    Case $nmsg = $GUI_EVENT_PRIMARYDOWN
    $Timer = 0
    Local $aMouse = GUIGetCursorInfo()
    If $aMouse[2] = 1 And $aMouse[4] = $btn1 Then $Timer = TimerInit()
    Case $nmsg = $GUI_EVENT_PRIMARYUP
    Local $aMouse = GUIGetCursorInfo()
    If $aMouse[4] = $btn1 And TimerDiff($Timer) > 5000 Then MsgBox(0, "Info", "Button wurde 5 SEkunden oder länger gedückt")
    $Timer = 0
    Case $nmsg = $btn2
    MsgBox(0, "", "test")
    EndSelect
    WEnd

    [/autoit]


    Edit: Und noch ein Beispiel

    Spoiler anzeigen
    [autoit]

    #Region - Timestamp
    ; 2012-04-09 00:25:43
    #EndRegion
    #include <GUIConstantsEx.au3>
    #include <GuiButton.au3>
    Global $Timer
    Global $gui = GUICreate("test")
    Global $btn1 = GUICtrlCreateButton("5 sek gedrückt halten", 0, 0)
    Global $btn2 = GUICtrlCreateButton("test", 0, 50)
    GUISetState(@SW_SHOW)
    While 1
    $nmsg = GUIGetMsg($gui)
    Select
    Case $nmsg = $GUI_EVENT_CLOSE
    Exit
    Case $nmsg = $GUI_EVENT_PRIMARYDOWN
    $Timer = 0
    Local $aMouse = GUIGetCursorInfo()
    If $aMouse[2] = 1 And $aMouse[4] = $btn1 Then $Timer = TimerInit()
    Case $nmsg = $btn1
    If TimerDiff($Timer) > 5000 Then MsgBox(0, "Info", "Button wurde 5 SEkunden oder länger gedückt")
    $Timer = 0
    Case $nmsg = $btn2
    MsgBox(0, "", "test")
    EndSelect
    WEnd

    [/autoit]
  • Da mir grad eh langweilig ist, hier noch ein Versuch das etwas portabler zu machen:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    _DelayButtonInit()

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

    GUICreate("test")
    Global $btn1 = GUICtrlCreateButton("testbutton1",10,10)
    Global $btn2 = GUICtrlCreateButton("testbutton2",10,50)
    Global $btn3 = GUICtrlCreateButton("testbutton3",10,90)
    _RegisterDelayButton($btn1, "func1", 2000) ; _RegisterDelayButton(ButtonId, Function, Delay in ms)
    _RegisterDelayButton($btn2, "func2", 3000)
    _RegisterDelayButton($btn3, "func3", 5000)
    _UnregisterDelayButton($btn2)
    GUISetState(@SW_SHOW)

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

    While Sleep(10)
    If GUIGetMsg() = -3 Then Exit
    WEnd

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

    Func func1()
    MsgBox(0, "", "Button1")
    EndFunc
    Func func2()
    MsgBox(0, "", "Button2")
    EndFunc
    Func func3()
    MsgBox(0, "", "Button3")
    EndFunc

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

    ; -----------------------------------------------------------------
    Func _DelayButtonInit()
    Global $avRegisteredButtons[1][3] = [[0,'','']]
    AdlibRegister("__CheckButtons")
    EndFunc

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

    Func _RegisterDelayButton($idButton, $sFunc, $iDelay)
    Local $iUBound = UBound($avRegisteredButtons, 1)
    ReDim $avRegisteredButtons[$iUBound+1][3]
    $avRegisteredButtons[$iUBound][0] = $idButton
    $avRegisteredButtons[$iUBound][1] = $sFunc
    $avRegisteredButtons[$iUBound][2] = $iDelay
    $avRegisteredButtons[0][0] = $iUBound
    EndFunc

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

    Func _UnregisterDelayButton($idButton)
    Local $iUBound = UBound($avRegisteredButtons, 1)
    For $iI = 1 To $avRegisteredButtons[0][0]
    If $avRegisteredButtons[$iI][0] = $idButton Then
    _ArrayDelete($avRegisteredButtons, $iI)
    $avRegisteredButtons[0][0] = $iUBound-2
    Return
    EndIf
    Next
    EndFunc

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

    Func __CheckButtons()
    Local $aCursorInfo = GUIGetCursorInfo()
    If $aCursorInfo[2] Then
    For $iI = 1 To $avRegisteredButtons[0][0]
    If $aCursorInfo[4] = $avRegisteredButtons[$iI][0] Then
    $timer = TimerInit()
    While 1
    Sleep(100)
    If GUIGetMsg() = $avRegisteredButtons[$iI][0] Then
    If TimerDiff($timer) > $avRegisteredButtons[$iI][2] Then
    Call($avRegisteredButtons[$iI][1])
    Return
    Else
    Return
    EndIf
    EndIf
    ConsoleWrite(TimerDiff($timer) & @CRLF)
    WEnd
    EndIf
    Next
    EndIf
    EndFunc

    [/autoit]

    Es ist ohne jegliche Fehlerabfrage & co und ist noch verbesserungswürdig...

    €: Mir fällt grad auf, dass es verbuggt ist: wenn man den Button drückt und die Maustaste gedrückt hält und außerhalb vom Button geht, dann läuft die Schleife weiter. Keine Lust das jetzt gescheit zu fixen, wenn du es so verwenden willst, kannst du selber rumprobieren.
    Zum Beispiel einfach in Zeile 61 While 1 mit While BitAND(_GUICtrlButton_GetState($avRegisteredButtons[$iI][0]), $BST_PUSHED) = $BST_PUSHED zu ersetzten...
    Ich denke du hast jetzt genügend Lösungsvorschläge:D

    Zitat

    You just keep on trying 'till you run out of cake. ;)


    [STEAM] Source UDF

    2 Mal editiert, zuletzt von K4z (9. April 2012 um 01:58)

  • Raupi :
    Jetzt, wo ich mir deine letzten Beispiele so ansehe muss ich dir absolut recht geben, dass der Code, wie ich ihn mir zurecht gelegt hab,
    umständlich und kompliziert ist. Aber er funtkioniert tatsächlich. Sselbst wenn ich mit der Maus (bei gedrücktem Button) von diesem Button
    vorzeitig weggehe, läuft die Zeit nicht weiter und GUIGetMsg funktioniert wieder, denn unmitelbar danach hab ich auf den 2. Button geklickt
    und schwupps kam die Messagebox.

    Was mir erst jetzt klar geworden ist, beim Blick auf deinem letzten Post:

    [autoit]

    Case $nmsg = $GUI_EVENT_PRIMARYDOWN

    [/autoit]


    Warum ich nicht drauf gekommen bin?! Weil ich in dem Script, wo der Button zum Einsatz kommen soll, ja bereits mit

    [autoit]

    Case $nmsg = $GUI_EVENT_CLOSE

    [/autoit]

    arbeite...
    Manchmal sieht man eben den Wald vor Bäume nicht.

    Fazit:
    Ich muss noch ne ganze Menge lernen. Dabei schien es mir eine gute Idee zu sein, den OnEventMode zu aktivieren und wieder zu deaktivieren.