Doppelklick auf einen GUICtrlCreateLabel

  • Ich möchte, dass das Programm erst auf einen Doppelklick auf das Label "Ja" reagiert.
    Führe ich den Doppelklick langsam aus klappt das auch. Bei einem normal-schnellen Doppelklick funktioniert es nicht.
    Das wird an der Bemerkung in der Hilfe von GUIGetMsg liegen:

    Bemerkungen
    Diese Funktion gibt die CPU automatisch wieder frei, wenn es erforderlich ist, so dass sie ruhig in Dauerschleifen benutzt werden kann, ohne die CPU vollständig auszulasten.

    Hat jemand einen Rat, wie ich hier Abhilfe schaffen könnte?
    Vielen Dank schon mal im Voraus.

    [autoit]

    #include <GUIConstantsEx.au3>
    $winhandle=GUICreate("DESKTOP2",300,100,200,400)
    $ja=GUICtrlCreateLabel("Ja", 20, 20, 30,15 )
    GUISetState()
    $n=0
    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    If $msg = $ja Then
    $n+=1
    If $n=2 Then MsgBox(0,"Titel", "Text")
    EndIf
    WEnd
    GUIDelete ( $winhandle )

    [/autoit]

    Einmal editiert, zuletzt von DOheim (23. Januar 2014 um 12:07)

    • Offizieller Beitrag

    Hier mal Dein Script im OnEventMode (da gibt es das Problem mit GUIGetMsg nicht):

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>

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

    Opt('GUIOnEventMode', 1)

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

    $winhandle = GUICreate("DESKTOP2", 300, 100, 200, 400)
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_DoppelklickLabel')
    GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseWindow')

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

    $ja = GUICtrlCreateLabel("Ja", 20, 20, 30, 15)
    GUISetState()
    Global $iTimer = TimerInit()

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

    WinWaitClose($winhandle)
    Exit

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

    Func _CloseWindow()
    GUIDelete($winhandle)
    EndFunc ;==>_CloseWindow

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

    Func _DoppelklickLabel()
    Local $aCursorInfo = GUIGetCursorInfo($winhandle)
    If @error Then Return
    If $aCursorInfo[4] <> $ja Then Return
    Local $iDoubleClickSpeed = RegRead('HKCU\Control Panel\Mouse', 'DoubleClickSpeed')
    If TimerDiff($iTimer) < $iDoubleClickSpeed Then MsgBox(0, "Titel", "Text")
    $iTimer = TimerInit()
    EndFunc ;==>_DoppelklickLabel

    [/autoit]
  • Nochmals recht vielen Dank!!!!!
    Das ist ja ein bis aufs letzte ausgefeiltes Programm.
    Schon allein die Tatsache, dass "'HKCU\Control Panel\Mouse', 'DoubleClickSpeed'" berücksichtigt ist. Ich hätte nie gewusst, wo das steht.
    Der Explorer bei WinXP hatte sich immer für jeden Ordner die Position der Symbole im Fenster gemerkt. Das ist bei Win7 verlorengegangen. Ich habe mir ein Programm geschrieben, das den Explorer in einigen Eigenschaften simuliert und bei dem ich die Position der Symbole vorgeben kann. Das klappt auch schon, aber nur mit einfachem Klick. Man ist aber gewöhnt immer doppelt zu klicken. Und dann entsteht oftmals Unsinn.
    Ich schreibe das, damit Du weißt, für was Du Dir soviel Mühe gegeben hast. Vielen Dank nochmal.

    • Offizieller Beitrag

    War eigentlich keine große Mühe. Die "Doppelklick-Funktion" hatte ich auch schonmal gebraucht. Von daher war das meiste eher Copy & Paste. ^^
    Generell bevorzuge ich aber den OnEventMode. Mir gefällt es alles in Funktionen auszulagern (IMHO übersichtlicher), anstatt eine MsgLoop-Schleife zu verwenden.
    Mal ganz abgesehen davon, dass es mit GUIGetMsg auch diverse Probleme gibt.