Что нового

[Время, дата] Обработка события "Изменение системного времени"

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Подскажите, пожалуйста, как можно отреагировать в скрипте AUTOIT на событие, возникающее при изменении системного времени?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
#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
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Yashied
Спасибо... +1 :smile:
Благодаря твоему примеру, я нашел ошибку в своем...
Оказывается, я не создал GUI...
Думал, зачем мне окно, без него обойдусь...
Но событие без GUI, пусть даже скрытого, не регистрируется...

Вот результат минимализма:

Код:
; НАЧАЛО

 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

; КОНЕЦ


Хотел бы еще уточнить: можно ли нагружать функции, связанные с событиями, какими либо действиями или это может сказаться на стабильности работы операционной системы?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
snoitaleR [?]
Вот результат минимализма
Минимализм в программирований не всегда приветствуется ;)
Это ощущается после нескольких лет кодингда, например, когда открываешь свои старые исходники, и понимаешь, что... нифига в них не понятно :laugh:, даже свой собственный код воспринимается как чужой и корявый.
Хотя может быть это только я...

[?]
можно ли нагружать функции, связанные с событиями, какими либо действиями
Не желательно, в справке написано:

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 !!!

т.е не должно ничего блокировать подобные функций, и выход из них должен происходить как можно раньше.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: [Время, дата] Обработка события \"Изменение системного времени\"

snoitaleR сказал(а):
Хотел бы еще уточнить: можно ли нагружать функции, связанные с событиями, какими либо действиями или это может сказаться на стабильности работы операционной системы?

Нагружать можно (правда, лучше обойтись без этого), но тормозить нельзя, иначе зависнет программа.

И еще, я заметил, что функция WM_TIMECHANGE может вызываться два раза. Тебе лучше это предусмотреть (если нужно). Например, попробуй изменить дату/время через панель управления...


Добавлено:
Сообщение автоматически объединено:

snoitaleR сказал(а):
Оказывается, я не создал GUI...
Думал, зачем мне окно, без него обойдусь...
Но событие без GUI, пусть даже скрытого, не регистрируется...

Если не хочешь создавать GUI, то можешь повесить hook на скрытое окно AutoIt - AutoItWinGetTitle(), но оно надо...?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied [?]
я заметил, что функция WM_TIMECHANGE может вызываться два раза
Да, я это тоже заметил. Кстати, не уверен что оно связано, но в теле UDF'а _Date_Time_SetLocalTime есть упоминание о похожей ситуаций:

; 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.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Это можно пофиксить брутальным способом.

Код:
#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
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied [?]
Это можно пофиксить брутальным способом
У меня это предотвращается другим, но полагаю менее надёжным способом:

Код:
Switch $hWnd
		Case $hForm
			$tTime = _Date_Time_GetLocalTime()
			ConsoleWrite(_Date_Time_SystemTimeToDateTimeStr($tTime) & @CR)
			Sleep(1)
	EndSwitch
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Теоретически, это не должно работать, т.к. все сообщения должны помещаться в очередь. Простая задержка ничего не должна изменить, но GUIRegisterMsg() не совсем сообщения системы... И видимо это каким-то образом срабатывает...

:smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied [?]
Теоретически, это не должно работать, т.к. все сообщения должны помещаться в очередь
Ну видимо задержка просто даёт время событию отработать, т.е второе сообщение не посылается из за того что первое отработало как и было задуманно (баг системы?).

GUIRegisterMsg() не совсем сообщения системы
А ты пробовал повесить хук на это дело, может там не будет этого явления?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
CreatoR сказал(а):
А ты пробовал повесить хук на это дело, может там не будет этого явления?

Если честно, то не пробывал. Лень... Позже может быть...

:sleeping:
 
Верх