Jump to content

Recommended Posts

Posted (edited)

Here is my wrapper forĀ SetTimer andĀ KillTimer APIs.
AutoIt already has its own, but I tried to make it as simple as I could.

#include-once

Global $g_avSimpleTimers = [[0, 0]]

Func TimerSet($vFunction, $uInterval)
    Local $hFunction = DllCallbackRegister($vFunction, "none", "HWND;UINT;UINT_PTR;DWORD")
    If ($hFunction = 0) Then Return 0

    Local $uTimerId = DllCall("user32.dll", "UINT_PTR", "SetTimer", _
            "HWND", 0, _
            "UINT_PTR", 0, _
            "UINT", $uInterval, _
            "ptr", DllCallbackGetPtr($hFunction))[0]

    If ($uTimerId = 0) Then
        DllCallbackFree($hFunction)
        Return 0
    EndIf

    ReDim $g_avSimpleTimers[$g_avSimpleTimers[0][0] + 2][2]
    $g_avSimpleTimers[$g_avSimpleTimers[0][0] + 1][0] = $uTimerId
    $g_avSimpleTimers[$g_avSimpleTimers[0][0] + 1][1] = $hFunction
    $g_avSimpleTimers[0][0] += 1

    Return $uTimerId
EndFunc

Func TimerUnset($uTimerId)
    If ($g_avSimpleTimers[0][0] = 0) Then Return False

    Local $iCount = $g_avSimpleTimers[0][0]
    For $i = 1 To $iCount + 1
        If ($g_avSimpleTimers[$i][0] = $uTimerId) Then
            DllCall("user32.dll", "BOOL", "KillTimer", _
                    "HWND", 0, _
                    "UINT_PTR", $uTimerId)

            DllCallbackFree($g_avSimpleTimers[$i][1])

            For $j = $i To $iCount - 1
                $g_avSimpleTimers[$j][0] = $g_avSimpleTimers[$j + 1][0]
                $g_avSimpleTimers[$j][1] = $g_avSimpleTimers[$j + 1][1]
            Next

            $g_avSimpleTimers[0][0] = $iCount - 1
            ReDim $g_avSimpleTimers[$iCount][2]

            Return True
        EndIf
    Next

    Return False
EndFunc

Example:

#include "Simple Timers.au3"

Global $t1 = TimerSet(Foo, 500)
Global $t2 = TimerSet("Bar", 1000)

MsgBox(0, "", "Check the console.")

TimerUnset($t1)

MsgBox(0, "", "Check the console again.")

TimerUnset($t2) ;Not necessary if you are exiting the script

Func Foo($a, $b, $c, $d)
    ConsoleWrite(">Foo" & @CRLF)
EndFunc

Func Bar($a, $b, $c, $d)
    ConsoleWrite("!Bar" & @CRLF)
EndFunc

Download both UDF and example:

Edited by D4RKON3

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...