timer flackern und klickregistrierung ist träge

  • hallo zusammen,

    ich habe mir folgendes skript geschrieben:

    Spoiler anzeigen
    [autoit]


    #include <GuiConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <WinAPI.au3>
    #include <Misc.au3>

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

    HotKeySet("{NUMPAD9}", "On_Exit") ; only on desktop

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

    Global $SS_CENTER, $hGUI, $aRadio[5], $hButton, $res
    Global $TimeTicks_d, $TimeTicks_b, $TimeTicks_ob, $TimeTicks_or, $TimeTicks_tb, $TimeTicks_tr, $TimeTicks
    Global $_SecCalc_d, $_SecCalc_b, $_SecCalc_ob, $_SecCalc_or, $_SecCalc_tb, $_SecCalc_tr, $_SecCalc
    Global $_Seconds_d, $_Seconds_b, $_Seconds_ob, $_Seconds_or, $_Seconds_tb, $_Seconds_tr, $_Seconds
    Global $iAdlibTicks = 20
    Global $aTimerStart[6] = [360, 420, 300, 300, 300, 300]
    Global $iTimerCount = 6 ; Amount of Timers
    Global $TimeLabel[$iTimerCount]
    Global $aTimer[$iTimerCount]
    Global $iFlashStartTicks = 21000 ; Timer lower than 20 seks
    Global $iProgTimer = TimerInit()
    Global $iCount
    Global $TimerActive[$iTimerCount] = [False, False, False, False, False, False]

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

    $hGUI = GUICreate("LJT", 150, 190)

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

    GUICtrlCreateLabel("Choose your resolution", 10, 10, 150, 20)

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

    GUIStartGroup()
    For $i = 0 To 4
    Local $res[5] = ["2560 x 1440", "1920 x 1080", "1600 x 900", "1280 x 720", "1024 x 768"]
    $aRadio[$i] = GUICtrlCreateRadio($res[$i], 55, 30 + ($i * 20), 100, 20)
    Next
    GUICtrlSetState($aRadio[0], $GUI_CHECKED)

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

    $hButton = GUICtrlCreateButton("Start Overlay", 35, 150, 80, 30)

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

    GUISetState()

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

    While 1

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

    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $hButton
    GUISetState(@SW_HIDE, $hGUI)
    For $i = 0 To 4
    If GUICtrlRead($aRadio[$i]) = 1 Then
    $res = $i
    ExitLoop
    EndIf
    Next
    Timer()
    EndSwitch

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

    WEnd

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

    ; -------------

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

    Func Timer()
    Local $pos[$iTimerCount][2] = [[1825, 990], [1738, 884], [1720, 929], [1788, 996], [1842, 945], [1772, 877]] ; Timer positions [[dx, dy], [bx, by], [obx, oby], [orx, ory], [tbx, tby], [trx, try]]
    Local $color_code[$iTimerCount] = [0xFF00FF, 0xFF00FF, 0x00FF00, 0xFF0000, 0x00FF00, 0xFF0000] ; Timer color [d, b, ob, or, tb, tr]
    Local $hRectangle_GUI = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, $WS_EX_TOOLWINDOW + $WS_EX_TOPMOST + $WS_EX_LAYERED + $WS_EX_TRANSPARENT)
    Local $hMaster_Mask = _WinAPI_CreateRectRgn(0, 0, @DesktopWidth, @DesktopHeight)
    For $i=0 To $iTimerCount - 1 ; Create timer, set font, set color
    $TimeLabel[$i] = GUICtrlCreateLabel ( "", $pos[$i][0], $pos[$i][1], 20, 15, $SS_CENTER)
    GuiCtrlSetColor(-1, $color_code[$i])
    GUICtrlSetBkColor(-1, 0xABCDEF)
    Next
    GUISetBkColor(0xABCDEF)
    _WinAPI_SetLayeredWindowAttributes($hRectangle_GUI, 0xABCDEF, 255)
    GUISetState()
    AdlibRegister('_Check', $iAdlibTicks)
    AdlibRegister('_Pressed', $iAdlibTicks)
    EndFunc

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

    Func _Pressed ()
    If _IsPressed('60') Then
    _StartTimer(0)
    Sleep(100)
    ElseIf _IsPressed('6E') Then
    _StartTimer(1)
    Sleep(100)
    ElseIf _IsPressed('61') Then
    _StartTimer(2)
    Sleep(100)
    ElseIf _IsPressed('64') Then
    _StartTimer(3)
    Sleep(100)
    ElseIf _IsPressed('63') Then
    _StartTimer(4)
    Sleep(100)
    ElseIf _IsPressed('66') Then
    _StartTimer(5)
    Sleep(500)
    EndIf
    EndFunc

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

    Func _Check ()
    Local $aTicks[$iTimerCount]
    Local $iTicks = TimerDiff($iProgTimer)
    For $i = 0 To $iTimerCount - 1
    $aTicks[$i] = ($iTicks - $aTimer[$i])
    Next
    For $i = 0 To $iTimerCount - 1
    If $TimerActive[$i] Then
    $iTicks = $aTimerStart[$i] * 1000 - $aticks[$i]
    If $iTicks < $iFlashStartTicks Then
    If $iTicks <= 0 Then
    $TimerActive[$i] = not $TimerActive[$i]
    $iTicks = 0
    GUISetState(@SW_HIDE, $TimerActive[$i])
    EndIf
    EndIf
    GUICtrlSetData($TimeLabel[$i], _MyTicksToTime($iTicks))
    EndIf
    Next
    EndFunc

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

    Func _MyTicksToTime($iTicks)
    Local $sOut = StringRight(Int($iTicks/1000), 3)
    Return $sOut
    EndFunc

    Func _StartTimer($iCount)
    $TimerActive[$iCount] = not $TimerActive[$iCount]
    GUISetState(@SW_SHOW, $TimerActive[$iCount])
    If $TimerActive[$iCount] Then
    $aTimer[$iCount] = TimerDiff($iProgTimer)
    Else
    GUICtrlSetData($TimeLabel[$iCount], '')
    EndIf
    EndFunc

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

    Func On_Exit()

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

    Exit

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

    EndFunc

    [/autoit]


    was das skript tut ist folgendes:

    1) gui startet in der man eine auflösung auswählt (für meine frage uninteressant, und für spätere funktionen vorgesehen)

    2) dann wird ein transparentes und nicht anklickbares overlay erstellt

    3) durch klicken der tasten numblock 0,1,3,4,6,komma können timer in der
    rechten unteren bildschirmecke gestartet werden. (diese funktion wurde
    über "_IsPressed" und nicht über einen hotkeyset realisiert, da die
    timer sonst falls eine anwendung die selben hotkeys benutzt nicht gestartet werden können


    probiert das skript am besten einfach mal aus, dann werdet ihr merken
    was ich genau mit dem timerflackern und der trägen antwort auf die
    tasteneingaben meine.


    hoffe ihr könnt mir helfen. Sinn soll es sein mit dem skript timer zu starten die dann runterzählen bis auf 0 und dann verschwinden
    und sich bei nochmaligem drücken erneuern (bis auf die oben genannten
    probleme funktioniert das auch)


    viele grüße

    63rrit

  • Ich würde dir empfehlen, an der $iAdlibTicks zuschrauben. Ich denke, du solltest mal bei ca. 200 anfangen...
    Momentan überprüfst du ja 50 mal in der Sekunde, ob eine Taste gedrückt wurde und updatest die Timer... Das es da flackert ist ja kein Wunder :D
    Da du in Sekunden zählst würde es vermutlich ausreichen, wenn du $iAdlibTicks auf 500 setzt...
    Da du die variable nur für das AdlibRegister benutzt (an 2 Stellen) würde ich dir empfehlen, auf diese variable ganz zu verzichten und stattdessen bei der _check auf 500 zu setzten und bei der _pressed auf 200 ;)

    Das Problem sollte leicht erkennbar sein, wenn du auf die CPU-Auslastung deines Programmes schaust :D :P

    • Offizieller Beitrag

    3) durch klicken der tasten numblock 0,1,3,4,6,komma können timer in der
    rechten unteren bildschirmecke gestartet werden. (diese funktion wurde
    über "_IsPressed" und nicht über einen hotkeyset realisiert, da die
    timer sonst falls eine anwendung die selben hotkeys benutzt nicht gestartet werden können


    Setze dir ein paar Dummy-Ctrl auf deine Overlay-GUI.
    Diesen weist du mit GUISetAccelerators Hotkeys zu, die sind dann ausschliesslich mit dieser GUI wirksam. Dann sollten die Reaktionszeiten auch nicht mehr träge sein.

  • Setze dir ein paar Dummy-Ctrl auf deine Overlay-GUI.
    Diesen weist du mit GUISetAccelerators Hotkeys zu, die sind dann ausschliesslich mit dieser GUI wirksam. Dann sollten die Reaktionszeiten auch nicht mehr träge sein.

    kannst du mir zum besseren verständnis ein paar zeilen beispielcode schreiben? wäre super :)

  • [autoit]

    $dummy = GUICtrlCreateDummy()
    $dummy2 = GUICtrlCreateDummy()
    Global $AccelKeys[2][2]=[["{ESC}", $dummy],["^{a}",$dummy2]]
    GUICtrlSetOnEvent($dummy, "Close")
    GUICtrlSetOnEvent($dummy2, "_selAll")
    GUISetAccelerators($AccelKeys,$Form1)

    [/autoit]


    Du solltest allerdings wissen, dass du dann auf den Text (Die Timer) klicken must, bevor die Tastenkombination funktioniert (Sie funktioniert nur, wenn das Fenster aktiv ist).

  • Danke Kanashius, habe es mittlerweile auch selber hinbekommen.
    wie du schon sagst, funktioniert das ganze aber nur wenn das fenster aktiv ist -> kann ich dementsprechend nicht gebrauchen :( oder gibt es wege das zu umgehen?

    • Offizieller Beitrag

    oder gibt es wege das zu umgehen?


    Wenn du davon völlig losgelöst arbeiten willst, musst du schon den Hotkey vor dem System abfangen (Hooken). Existiert dein Fenster und der Hotkey wird gedrückt nutzt du ihn und verwirfst dann diesen Hook, damit das System damit nicht weiter arbeitet.
    Das Hooken von Keyevents ist nicht allzu schwer. Die Hilfe-Bsp. sollten dir als Impression reichen. Da sich damit auch viel Schindluder treiben läßt (z.B. Keylogger) ist der Support von uns dafür sehr begrenzt.