DllCallbackRegister parameter uebergabe

  • Hallo erstmal :P

    hab heute versucht eine alarmfunktion mittels dllcall zu realisieren .
    das ergebniss sollte sein, dass beim erreichen der alarm zeit die funktion
    _TimerCallBackFunc die gewuenschte operation aussfuehrt...
    soweit funktioniert das auch, aber mir fehlt noch eine art parameter uebergabe
    um mit der funktion _TimerCallBackFunc verschiedene aufgaben zu erfuellen

    zum beispiel wenn ich das ganze als alarm fuer eine wecker oder termin planer nutzen moechte
    dort mehrere alarme definiert werden die verschieden aufgaben erfuellen sollen,
    so kann das im moment die funktion nicht unterscheiden

    da ich unerfahren mit dem umgang von dll´s bin , dachte ich mir ich frag mal besser ^^

    wuerde mich ueber etwas hilfe freuen :)
    LG
    b0ony

    Spoiler anzeigen
    [autoit]


    Global Enum $TIMERID1 = 10002
    Global $hGUI, $iTimer1, $hCallBack

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

    ;alarm zeit editieren
    ;************************************************
    $alert_time_span = '17:28:00:777' ;uhr *
    ;$alert_date_span = '19/02/2008' *
    ;************************************************

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

    $now_time_span = _get_local_time() ;'19:00:00:001' ;
    $now_time_TickCount = _WinAPI_GetTickCount ()
    $alert_time_msec = _Convert_To_Ticks($alert_time_span, 4, ":")
    $now_time_msec = _Convert_To_Ticks($now_time_span[0], 4, ":")

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

    If $alert_time_msec <= $now_time_msec Then
    ConsoleWrite( "error :$alert_time_span => past: "& $alert_time_span & @CRLF)
    $MSec_Dif = 5000
    ElseIf $alert_time_msec > $now_time_msec Then
    $MSec_Dif = $alert_time_msec - $now_time_msec
    ConsoleWrite( "$MSec_Dif: "& $MSec_Dif& @CRLF)
    EndIf

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

    ;************************************************
    ; hier haette ich gerne eine parameter uebergabe an die
    ; _TimerCallBackFunc funktion zb. alarm type (sound,popup,action,usw)
    $hCallBack = DllCallbackRegister("_TimerCallBackFunc", "none", "hwnd;int;int;dword")
    $iTimer1 = _WinAPI_SetTimer($hGUI, $TIMERID1, $MSec_Dif, DllCallbackGetPtr($hCallBack))
    ;************************************************

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

    While 1
    Sleep(1000)
    WEnd

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

    ;---------------------------------------------------------|
    Func _Convert_To_Ticks($TimeSpan, $iElements = 3, $iDelimter = ":") ; 11:00:00:000
    Local $TParts = StringSplit($TimeSpan, $iDelimter, 1)
    If Not @error Then
    $iElements = $TParts[0]
    ;If $iElements = 1 Then $iTicks = 1000 * (3600 * $TParts)
    If $iElements = 2 Then $iTicks = 1000 * (3600 * $TParts[1]) + (60 * $TParts[2])
    If $iElements = 3 Then $iTicks = 1000 * ((3600 * $TParts[1]) + (60 * $TParts[2]) + $TParts[3])
    If $iElements = 4 Then $iTicks = 1000 * ((3600 * $TParts[1]) + (60 * $TParts[2]) + $TParts[3]) + $TParts[4]
    Return $iTicks
    Else
    SetError(1)
    Return 0
    EndIf
    EndFunc ;==>_TimeToTicks
    ;---------------------------------------------------------|
    Func _WinAPI_GetTickCount ()
    Local $TickCount = DllCall("Kernel32.dll", "int", "GetTickCount")
    Return $TickCount[0]
    EndFunc
    ;---------------------------------------------------------|
    Func _WinAPI_SetTimer($hWnd, $iIDEvent, $iElapse, $pTimerFunc = 0)
    Local $iResult = DllCall("user32.dll", "int", "SetTimer", "hwnd", $hWnd, "int", $iIDEvent, "int", $iElapse, "ptr", $pTimerFunc)
    If @error Then Return SetError(-1, -1, 0)
    Return $iResult[0]
    EndFunc ;==>_WinAPI_SetTimer
    ;---------------------------------------------------------|
    Func _get_local_time()
    Local $stSystemTime = DllStructCreate('ushort;ushort;ushort;ushort;ushort;ushort;ushort;ushort')
    DllCall('kernel32.dll', 'none', 'GetLocalTime', 'ptr', DllStructGetPtr($stSystemTime))

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

    $year = StringFormat('%04d', DllStructGetData($stSystemTime, 1))
    $mon = StringFormat('%02d', DllStructGetData($stSystemTime, 2) )
    $day = StringFormat('%02d', DllStructGetData($stSystemTime, 4))

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

    $hour = StringFormat('%02d', DllStructGetData($stSystemTime, 5)) ; MEZ
    $min = StringFormat('%02d', DllStructGetData($stSystemTime, 6))
    $sec = StringFormat('%02d', DllStructGetData($stSystemTime, 7))
    $msec = StringFormat('%03d', DllStructGetData($stSystemTime, 8))
    local $sys_date[2]
    $sys_date[0] = $hour&":"&$min&":"& $sec &":"& $msec
    $sys_date[1] = $hour&":"&$min&":"& $sec &":"& $msec &" "& $day &"/"& $mon &"/"& $year
    $stSystemTime = 0
    Return $sys_date
    EndFunc ;==>_sys_time
    ;---------------------------------------------------------|
    Func _TimerCallBackFunc($hWnd, $Msg, $iIDTimer, $dwTime)
    $test_time = _get_local_time()
    ConsoleWrite( "hWnd : " & $hWnd & " Msg : " & $Msg & " iIDTimer : " & $iIDTimer & " dwTime : " & $dwTime &" $test__time : "& $test_time[1] & @CRLF)
    ;
    _WinAPI_KillTimer($hGUI, $iTimer1)
    DllCallbackFree($hCallBack)
    exit
    EndFunc ;==>_TimerCallBackFunc
    ;---------------------------------------------------------|
    Func _WinAPI_KillTimer($hWnd, $iIDEvent)
    Local $iResult = DllCall("user32.dll", "int", "KillTimer", "hwnd", $hWnd, "int", $iIDEvent)
    If @error Then Return SetError(-1, -1, 0)
    Return $iResult[0] <> 0
    EndFunc ;==>_WinAPI_KillTimer
    ;---------------------------------------------------------|

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

    2 Mal editiert, zuletzt von b0ony (19. Februar 2008 um 18:15)

  • Du musst den Aufgaben die TimerIDs zuordnen und dann anhand der TimerID unterscheiden
    In der BETA hat es eine Timer UDF mit Erklärungen. Die kannst du sicher übertragen :)

  • Du musst den Aufgaben die TimerIDs zuordnen und dann anhand der TimerID unterscheiden
    In der BETA hat es eine Timer UDF mit Erklärungen. Die kannst du sicher übertragen :)

    hi progandy,
    und ein danke fuer die schnelle antwort gleich hinterher :P
    werde es versuchen der timerID zu regeln ...

    der code besteht zum teil aus der timers UDF der akteullen beta ..zumindest hab ich mir dort n bissel was rausgepickt
    bzw das hat mich erst auf die idee gebracht einen alarm so zu setzen ... bishar hatte ich das ueber Adlib geregelt, was aber je nach groesse und/oder ganaugigkeit (msec) der funktion doch auf die system ressoucen geht ...deshalb favorisiere ich diese oder eben jede andere loesung ^^
    LG