#Include <Date.au3>
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>
Global $hForm = GUICreate('')
GUIRegisterMsg($WM_TIMECHANGE, 'WM_TIMECHANGE')
Do
Until GUIGetMsg() = -3
Func WM_TIMECHANGE($hWnd, $iMsg, $wParam, $lParam)
Switch $hWnd
Case $hForm
$tTime = _Date_Time_GetLocalTime()
ConsoleWrite(_Date_Time_SystemTimeToDateTimeStr($tTime) & @CR)
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_TIMECHANGE
; НАЧАЛО
GUICreate("")
GUIRegisterMsg(0x1E,"TIMECHANGE")
$TC=false
While true
if $TC then
SplashTextOn("Внимание!","Изменилось системное время",300,50)
Sleep(3000)
SplashOff()
$TC=false
endif
Sleep(100)
Wend
Func TIMECHANGE()
$TC=true
Return "GUI_RUNDEFMSG"
EndFunc
; КОНЕЦ
Минимализм в программирований не всегда приветствуется ;)Вот результат минимализма
Не желательно, в справке написано:можно ли нагружать функции, связанные с событиями, какими либо действиями
Warning: blocking of running user functions which executes window messages with commands such as "Msgbox()" can lead to unexpected behavior, the return to the system should be as fast as possible !!!
snoitaleR сказал(а):Хотел бы еще уточнить: можно ли нагружать функции, связанные с событиями, какими либо действиями или это может сказаться на стабильности работы операционной системы?
snoitaleR сказал(а):Оказывается, я не создал GUI...
Думал, зачем мне окно, без него обойдусь...
Но событие без GUI, пусть даже скрытого, не регистрируется...
Да, я это тоже заметил. Кстати, не уверен что оно связано, но в теле UDF'а _Date_Time_SetLocalTime есть упоминание о похожей ситуаций:я заметил, что функция WM_TIMECHANGE может вызываться два раза
; The system uses UTC internally. When you call SetLocalTime, the system uses the current time zone information to perform the
; conversion, incuding the daylight saving time setting. The system uses the daylight saving time setting of the current time,
; not the new time you are setting. This is a "feature" according to Microsoft. In order to get around this, we have to call
; the function twice. The first call sets the internal time zone and the second call sets the actual time.
#Include <Date.au3>
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>
Global $Timer = 0, $hForm = GUICreate('')
GUIRegisterMsg($WM_TIMECHANGE, 'WM_TIMECHANGE')
Do
Until GUIGetMsg() = -3
Func WM_TIMECHANGE($hWnd, $iMsg, $wParam, $lParam)
Switch $hWnd
Case $hForm
If (Not $Timer) Or (TimerDiff($Timer) > 1000) Then
$tTime = _Date_Time_GetLocalTime()
ConsoleWrite(_Date_Time_SystemTimeToDateTimeStr($tTime) & @CR)
EndIf
$Timer = TimerInit()
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_TIMECHANGE
У меня это предотвращается другим, но полагаю менее надёжным способом:Это можно пофиксить брутальным способом
Switch $hWnd
Case $hForm
$tTime = _Date_Time_GetLocalTime()
ConsoleWrite(_Date_Time_SystemTimeToDateTimeStr($tTime) & @CR)
Sleep(1)
EndSwitch
Ну видимо задержка просто даёт время событию отработать, т.е второе сообщение не посылается из за того что первое отработало как и было задуманно (баг системы?).Теоретически, это не должно работать, т.к. все сообщения должны помещаться в очередь
А ты пробовал повесить хук на это дело, может там не будет этого явления?GUIRegisterMsg() не совсем сообщения системы
CreatoR сказал(а):А ты пробовал повесить хук на это дело, может там не будет этого явления?