• Offizieller Beitrag

    Nachdem ich in "Hilfe & Unterstützung" bereits das Grundgerüst gepostet habe, hier jetzt ein fertiges Script, mit diversen Einstell-Möglichkeiten (siehe Kommentare).

    Spoiler anzeigen
    [autoit]


    #NoTrayIcon
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    Opt('GUIOnEventMode', 1)

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

    ; Einstellungen Anfang (Achtung! Die Einstellungen werden nicht überprüft! Wer hier zu hohe/niedrige Werte einträgt, hat selbst Schuld! ;-))
    Global $iXSpacing = 140 ; horizontaler Abstand zwischen den Timern (min. 120 px)
    Global $iYSpacing = 120 ; vertikaler Abstand zwischen den Timern (min. 100 px)
    Global $iCountRow = 2 ; Anzahl der Timer-Reihen (min. 1)
    Global $iTimerPerRow = 5 ; Timer pro Reihe (min. 3)
    Global $iAdlibTicks = 20 ; ms für den AdlibRegister-Aufruf
    Global $iFlashStartTicks = 60000 ; ms bevor der Timer abgelaufen ist, fängt die LED an zu blinken
    Global $iTimerMin = 15 ; Minuten (Timer Mindestwert, min. 1 Minute)
    Global $iTimerMax = 45 ; Minuten (Timer Maximalwert, max. 99 Minuten)
    Global $iTimerStandard = 15 ; Minuten (Timer Standardwert, 1-99 im Bereich von Min. bis Max.)
    Global $iTimerStep = 15 ; Minuten (Timer Sprungweite, sollte ein Vielfaches von Min. sein im Bereich von Min. bis Max.)
    Global $iFlashInterval = 250 ; ms Intervallzeit für die Blink-LED
    Global $aFlashLED[4] = [0x000000, 0xFFFF00, 0xFF0000, 0x00FF00] ; Farben für die Blink-LED (Standard: schwarz/gelb = blinken, rot = Timer läuft nicht, grün = Timer läuft)
    ; Einstellungen Ende

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

    If Not FileExists(@ScriptDir & '\prog.ico') Then _Hourglass(True, @ScriptDir)
    Global Const $UDM_SETACCEL = 1131
    Global Const $UDM_SETRANGE32 = 1135
    Global Const $UDM_SETPOS32 = 1137
    Global $UDACCEL = DllStructCreate('UINT nSec; UINT nInc')
    Global $pUDACCEL = DllStructGetPtr($UDACCEL)
    DllStructSetData($UDACCEL, 'nSec', 0)
    DllStructSetData($UDACCEL, 'nInc', $iTimerStep)
    Global $iTimerCount = $iCountRow * $iTimerPerRow
    Global $aidTimerDisplay[$iTimerCount], $aidUpDownButton[$iTimerCount], $aidLED[$iTimerCount], $aidStartButton[$iTimerCount]
    Global $aTimer[$iTimerCount], $aTimerStart[$iTimerCount], $aFlashTimer[$iTimerCount][2]
    Global $iProgTimer = TimerInit()

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

    Global $hGui = GUICreate('Multi-Timer', $iTimerPerRow * $iXSpacing + $iXSpacing / 4, Int($iTimerCount / $iTimerPerRow) * $iYSpacing + 65)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseGui')
    GUISetIcon(@ScriptDir & '\prog.ico', 0, $hGui)
    For $i = 0 To $iTimerCount - 1
    $aTimerStart[$i] = $iTimerStandard ; TimerStart auf Standardwert setzen
    GUICtrlCreateLabel(StringFormat('Timer %02i', $i + 1), ($iXSpacing / 4) + Mod($i, $iTimerPerRow) * $iXSpacing, 20 + Int($i / $iTimerPerRow) * $iYSpacing, 100, 32, $SS_CENTER)
    GUICtrlSetFont(-1, 12, 400, 0, 'Tahoma')
    $aidTimerDisplay[$i] = GUICtrlCreateInput('', ($iXSpacing / 4) + Mod($i, $iTimerPerRow) * $iXSpacing, 50 + Int($i / $iTimerPerRow) * $iYSpacing, 116, 32, $ES_READONLY)
    GUICtrlSetOnEvent(-1, '_ChangeTime')
    GUICtrlSetFont(-1, 14, 400, 0, 'Tahoma')
    GUICtrlSetBkColor(-1, 0xFFFFFF)
    $aidUpDownButton[$i] = GUICtrlCreateUpdown(-1)
    GUICtrlSendMsg(-1, $UDM_SETRANGE32, $iTimerMin, $iTimerMax) ; Wertebereich setzen
    GUICtrlSendMsg(-1, $UDM_SETPOS32, 0, $iTimerStandard) ; Standardwert setzen
    GUICtrlSendMsg(-1, $UDM_SETACCEL, 1, $pUDACCEL) ; Sprungweite setzen
    GUICtrlSetData($aidTimerDisplay[$i], _MyTicksToTime($iTimerStandard * 60000)) ; Standardwert anzeigen
    $aidLED[$i] = GUICtrlCreateLabel('', ($iXSpacing / 4) + Mod($i, $iTimerPerRow) * $iXSpacing, 91 + Int($i / $iTimerPerRow) * $iYSpacing, 16, 16, Default, $WS_EX_CLIENTEDGE)
    GUICtrlSetBkColor(-1, $aFlashLED[2])
    $aidStartButton[$i] = GUICtrlCreateButton('Start', $iXSpacing / 4 + 18 + Mod($i, $iTimerPerRow) * $iXSpacing, 88 + Int($i / $iTimerPerRow) * $iYSpacing, 98, 22)
    GUICtrlSetOnEvent(-1, '_StartTimer')
    Next
    GUICtrlCreateButton('Alle starten', ($iXSpacing / 4) + ($iTimerPerRow / 2 - 1.5) * $iXSpacing, Int($iTimerCount / $iTimerPerRow) * $iYSpacing + 20, 116, 30)
    GUICtrlSetOnEvent(-1, '_StartAll')
    GUICtrlCreateButton('Startwerte laden', ($iXSpacing / 4) + ($iTimerPerRow / 2 - 0.5) * $iXSpacing, Int($iTimerCount / $iTimerPerRow) * $iYSpacing + 20, 116, 30)
    GUICtrlSetOnEvent(-1, '_LoadStartVal')
    GUICtrlCreateButton('Alle stoppen', ($iXSpacing / 4) + ($iTimerPerRow / 2 + 0.5) * $iXSpacing, Int($iTimerCount / $iTimerPerRow) * $iYSpacing + 20, 116, 30)
    GUICtrlSetOnEvent(-1, '_StopAll')

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

    GUISetState()

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

    AdlibRegister('_Timer', $iAdlibTicks)
    WinWaitClose($hGui)
    $UDACCEL = 0
    Exit

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

    Func _CloseGui()
    AdlibUnRegister('_Timer')
    GUIDelete($hGui)
    EndFunc ;==>_CloseGui

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

    Func _Timer()
    Local $aTicks[$iTimerCount], $iTicks = TimerDiff($iProgTimer)
    For $i = 0 To $iTimerCount - 1
    $aTicks[$i] = ($iTicks - $aTimer[$i])
    Next
    For $i = 0 To $iTimerCount - 1
    If BitAND(GUICtrlGetState($aidUpDownButton[$i]), $GUI_DISABLE) Then
    $iTicks = $aTimerStart[$i] * 60000 - $aTicks[$i]
    If $iTicks < $iFlashStartTicks Then ; wenn Timer-Zeit kleiner als die Blinkvorgabezeit, dann...
    If $iTicks <= 0 Then ; wenn Timer-Zeit Null erreicht hat, dann Timer stoppen
    GUICtrlSetOnEvent($aidStartButton[$i], '_StartTimer')
    GUICtrlSetData($aidStartButton[$i], 'Start')
    GUICtrlSetState($aidStartButton[$i], $GUI_DISABLE)
    GUICtrlSetState($aidUpDownButton[$i], $GUI_ENABLE)
    GUICtrlSetBkColor($aidLED[$i], $aFlashLED[1])
    $iTicks = 0
    $aFlashTimer[$i][0] = 0
    Else ; ansonsten LED blinken lassen
    If TimerDiff($aFlashTimer[$i][0]) >= $iFlashInterval Then ; wenn die Intervallzeit erreicht ist,
    $aFlashTimer[$i][0] = TimerInit() ; Intervallzeit-Timer neu setzen
    $aFlashTimer[$i][1] = Not $aFlashTimer[$i][1] ; Farbwert umkehren (0 <-> 1)
    GUICtrlSetBkColor($aidLED[$i], $aFlashLED[Number($aFlashTimer[$i][1])]) ; die Farbe der LED wechseln
    EndIf
    EndIf
    EndIf
    GUICtrlSetData($aidTimerDisplay[$i], _MyTicksToTime($iTicks)) ; Die ms des Timers in "Minuten:Sekunden.Millisekunden" umrechnen und anzeigen
    EndIf
    Next
    EndFunc ;==>_Timer

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

    Func _MyTicksToTime($iTicks)
    Local $sOut = StringRight('0' & Int($iTicks / 60000), 2)
    $iTicks = Mod($iTicks, 60000)
    $sOut &= ':' & StringRight('0' & Int($iTicks / 1000), 2)
    $iTicks = Mod($iTicks, 1000)
    Return $sOut & '.' & StringRight('00' & $iTicks, 3)
    EndFunc ;==>_MyTicksToTime

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

    Func _ChangeTime()
    Local $iCount = (@GUI_CtrlId - $aidTimerDisplay[0]) / 5
    $aTimerStart[$iCount] = GUICtrlRead(@GUI_CtrlId)
    GUICtrlSetData(@GUI_CtrlId, StringRight('0' & $aTimerStart[$iCount], 2) & ':00.000')
    GUICtrlSetState($aidStartButton[$iCount], $GUI_FOCUS)
    GUICtrlSetState($aidStartButton[$iCount], $GUI_ENABLE)
    GUICtrlSetBkColor($aidLED[$iCount], $aFlashLED[2])
    EndFunc ;==>_ChangeTime

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

    Func _LoadStartVal()
    For $i = 0 To $iTimerCount - 1
    If GUICtrlRead($aidLED[$i]) = ' ' Then ; nur die Werte der gestoppten Timer neu setzen
    GUICtrlSetData($aidLED[$i], '')
    GUICtrlSetData($aidTimerDisplay[$i], _MyTicksToTime($aTimerStart[$i] * 60000))
    GUICtrlSetOnEvent($aidStartButton[$i], '_StartTimer')
    GUICtrlSetData($aidStartButton[$i], 'Start')
    GUICtrlSetState($aidUpDownButton[$i], $GUI_ENABLE)
    GUICtrlSetState($aidStartButton[$i], $GUI_ENABLE)
    GUICtrlSetBkColor($aidLED[$i], $aFlashLED[2])
    EndIf
    Next
    EndFunc

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

    Func _StartAll()
    Local $iTimerDiff = TimerDiff($iProgTimer)
    For $i = 0 To $iTimerCount - 1
    GUICtrlSetOnEvent($aidStartButton[$i], '_StopTimer')
    GUICtrlSetData($aidStartButton[$i], 'Stop')
    GUICtrlSetState($aidStartButton[$i], $GUI_ENABLE)
    GUICtrlSetState($aidUpDownButton[$i], $GUI_DISABLE)
    GUICtrlSetBkColor($aidLED[$i], $aFlashLED[3])
    $aTimer[$i] = $iTimerDiff
    $aflashTimer[$i][0] = 0
    $aflashTimer[$i][1] = 0
    Next
    EndFunc ;==>_StartAll

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

    Func _StopAll()
    AdlibUnRegister('_Timer')
    _Timer()
    For $i = 0 To $iTimerCount - 1
    If BitAND(GUICtrlGetState($aidUpDownButton[$i]), $GUI_DISABLE) Then
    GUICtrlSetOnEvent($aidStartButton[$i], '_StartTimer')
    GUICtrlSetData($aidStartButton[$i], 'Start')
    GUICtrlSetState($aidUpDownButton[$i], $GUI_ENABLE)
    GUICtrlSetState($aidStartButton[$i], $GUI_DISABLE)
    GUICtrlSetBkColor($aidLED[$i], $aFlashLED[1])
    GUICtrlSetData($aidLED[$i], ' ')
    EndIf
    Next
    AdlibRegister('_Timer', $iAdlibTicks)
    EndFunc ;==>_StopAll

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

    Func _StartTimer()
    Local $iCount = (@GUI_CtrlId - $aidStartButton[0]) / 5
    GUICtrlSetOnEvent($aidStartButton[$iCount], '_StopTimer')
    GUICtrlSetData($aidStartButton[$iCount], 'Stop')
    GUICtrlSetState($aidUpDownButton[$iCount], $GUI_DISABLE)
    GUICtrlSetBkColor($aidLED[$iCount], $aFlashLED[3])
    $aTimer[$iCount] = TimerDiff($iProgTimer)
    $aflashTimer[$iCount][0] = 0
    $aflashTimer[$iCount][1] = 0
    EndFunc ;==>_StartTimer

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

    Func _StopTimer()
    Local $iCount = (@GUI_CtrlId - $aidStartButton[0]) / 5
    GUICtrlSetState($aidStartButton[$iCount], $GUI_DISABLE)
    GUICtrlSetOnEvent($aidStartButton[$iCount], '_StartTimer')
    GUICtrlSetData($aidStartButton[$iCount], 'Start')
    GUICtrlSetState($aidUpDownButton[$iCount], $GUI_ENABLE)
    GUICtrlSetBkColor($aidLED[$iCount], $aFlashLED[1])
    GUICtrlSetData($aidLED[$iCount], ' ')
    EndFunc ;==>_StopTimer

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

    ;Code below was generated by: 'File to Base64 String' Code Generator v1.12 Build 2013-03-25

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

    Func _Hourglass($bSaveBinary = False, $sSavePath = @ScriptDir)
    Local $Hourglass
    $Hourglass &= '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'
    $Hourglass &= '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'
    $Hourglass &= '/059tP8APnCs/zhppf9ELVzwBVqX958FAAIAMHQCMF+Z3EkAfLb3UIS+/1MAh8H/VInD/1UAisT/VovF/1fEjMYyAFiNxzIAMQEPsQExArECMQNHerT0MC9emL7fBfZlOiwAW5V/MWGbsDeAZ6HOOmqk3HB8AOU+b6n0QHGrHv8yAPBwMQAxATxspgbmMQKxAjFgmq4raFqUdTAELZ8FOgYHVbAMGDAAJzAALjAAM3UwADowAEAxAPABNQA6VTAAMzAALjAAJzAAF0MwAL6J4AAHQTUAwAM0ALEA+AAfQfwAAj8yAP8A/0H/geM0ALAA/gB/cgExAjEA+PAADzYEdQRxAHEBcZgeEDAAEZh/mA8ABAgOABAOHTE/EiU+AGETKUR4FCtI4IQWLkyRMQCxADEBD7EBMQKxAv4RWpnoLgRip/CPt/9bkMcA/22h0/9xpdYA/2ab0f9TicUE/z9wkTBmrP8ngFmf/ydXl+g/jgCb/Dhmof9SfwCy/1+Mu/9kkCC9/2eSvjIAYo4AvP9biLn/Tnogr/81YZ2wjJnxAf8ZkUdTbIrBuAjByPGxhcbZ5/4BdYWauND7093lAPq0vcXwU2uJDr4xGh8QclkEnpqRALX9+/XW//nsALquzeLjrsziAOP/8td1/fnx4MSemZC0MQKfAzpvACSjn5ez+vbtAMDL2t++y9rcoLr78uCWMAGysQEHHwMPADAGIZyXj6AQ2OHfqzGLnJeOHp8xAZ8CDwC4cVKzvnzAvDEAsQAfAg8A+AcLAJSVkaiy0OTqgKnL4u2Pk5MxUA4LnwIPADAOJaGdlgC16/Dw2s7b3QC7zNrcu8zd5uDSl5mYwbEBHwP7FwCfmpG0/fr00jD/+Oy49ljwF/b2MPLLnpr/F/xjaugA4dSx///++P8I9+esO2PvwOjhDNOrMQKfAwAALF0AmWpGaZXVTnkEq+Bwte1Rgrb1gE6Bt/9JfLUxUQD1QnKq7Uhzp+DgRWiT1rBaPgQwwAT8NPG5c63/WIMAtf9njrv/ao4Auv9pjrn/YYiAuP9QfLH/OHFZMmEwWViX4NL7LzJhAJvHSHu1/0+DHr1yT3FQOVExAU+CvLWxUP8wS68fDHIEKjAAqlAwAGYwAHgwAIA0ABexADEBsQEmOQPAA6wKQTEAgHQA4AesQQDwD6xB+B+sQfz8P3MA8QBxATEA+QLxAA=='
    $Hourglass = _Base64Decode($Hourglass)
    Local $tSource = DllStructCreate('byte[' & BinaryLen($Hourglass) & ']')
    DllStructSetData($tSource, 1, $Hourglass)
    Local $tDecompress
    _WinAPI_LZNTDecompress($tSource, $tDecompress, 7886)
    $tSource = 0
    Local $bString = Binary(DllStructGetData($tDecompress, 1))
    If $bSaveBinary Then
    Local $hFile = FileOpen($sSavePath & "\prog.ico", 18)
    FileWrite($hFile, $bString)
    FileClose($hFile)
    EndIf
    Return $bString
    EndFunc ;==>_Hourglass

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

    Func _Base64Decode($sB64String)
    Local $struct = DllStructCreate("int")
    Local $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", "str", $sB64String, "int", 0, "int", 1, "ptr", 0, "ptr", DllStructGetPtr($struct, 1), "ptr", 0, "ptr", 0)
    If @error Or Not $a_Call[0] Then Return SetError(1, 0, "")
    Local $a = DllStructCreate("byte[" & DllStructGetData($struct, 1) & "]")
    $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", "str", $sB64String, "int", 0, "int", 1, "ptr", DllStructGetPtr($a), "ptr", DllStructGetPtr($struct, 1), "ptr", 0, "ptr", 0)
    If @error Or Not $a_Call[0] Then Return SetError(2, 0, "")
    Return DllStructGetData($a, 1)
    EndFunc ;==>_Base64Decode

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

    Func _WinAPI_LZNTDecompress(ByRef $tInput, ByRef $tOutput, $iBufferSize = 0x800000)
    Local $tBuffer, $Ret
    $tOutput = 0
    $tBuffer = DllStructCreate('byte[' & $iBufferSize & ']')
    If @error Then Return SetError(1, 0, 0)
    $Ret = DllCall('ntdll.dll', 'uint', 'RtlDecompressBuffer', 'ushort', 0x0002, 'ptr', DllStructGetPtr($tBuffer), 'ulong', $iBufferSize, 'ptr', DllStructGetPtr($tInput), 'ulong', DllStructGetSize($tInput), 'ulong*', 0)
    If @error Then Return SetError(2, 0, 0)
    If $Ret[0] Then Return SetError(3, $Ret[0], 0)
    $tOutput = DllStructCreate('byte[' & $Ret[6] & ']')
    If Not _WinAPI_MoveMemory(DllStructGetPtr($tOutput), DllStructGetPtr($tBuffer), $Ret[6]) Then
    $tOutput = 0
    Return SetError(4, 0, 0)
    EndIf
    Return $Ret[6]
    EndFunc ;==>_WinAPI_LZNTDecompress

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

    Func _WinAPI_MoveMemory($pDestination, $pSource, $iLenght)
    DllCall('ntdll.dll', 'none', 'RtlMoveMemory', 'ptr', $pDestination, 'ptr', $pSource, 'ulong_ptr', $iLenght)
    If @error Then Return SetError(5, 0, 0)
    Return 1
    EndFunc ;==>_WinAPI_MoveMemory

    [/autoit]