#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
#include <ScreenCapture.au3>
#include <Array.au3>
#include <Date.au3>
Global $sNTP = 'ntp1.stratum2.ru' ; Сервер NTP
Global $iTimeInterval = 300 ; Интервал обновления времени в миллисекундах
Global $vDateTime = '2016/07/29 20:46:10' ; Время создания скриншотА (формат ГГГ/MM/ДД чч:мм:сс:мсс)
Global $sDir = @ScriptDir ; Папка для скриншотов
Global $iTimePrev, $iScrTime
$aDT = StringRegExp($vDateTime, '(\d{4})/(\d{2})/(\d{2})\h(\d{2}):(\d{2}):(\d{2})', 3)
If @error Or UBound($aDT) <> 6 Then Exit MsgBox(4096+16, 'Ошибка!', 'Задайте правильно время создания скриншота.')
$vDateTime = Number(_ArrayToString($aDT, ''))
Global $hGui = GUICreate("Часы", 155, 111, -1, -1, -1, $WS_EX_TOPMOST)
AdlibRegister("MainScript", $iTimeInterval) ; Обновление часов
$Clock = GUICtrlCreateLabel(@HOUR & ":" & @MIN & ":" & @SEC, 50, 20)
GUISetState()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
If $iScrTime >= $vDateTime Then
_ScreenCapture_CaptureWnd($sDir & '\My_Screen[' & $iScrTime & '].jpg', $hGui)
$vDateTime *= 2
EndIf
WEnd
Func MainScript()
Local $aFT, $sTime, $tFT = _NTP_FT($sNTP)
If Not @error Then
$aFT = _Date_Time_FileTimeToArray($tFT)
If UBound($aFT) >= 6 Then
$sTime = StringFormat('%02d:%02d:%02d', $aFT[3], $aFT[4], $aFT[5])
If $sTime <> $iTimePrev Then
GUICtrlSetData($Clock, $sTime)
$iTimePrev = $sTime
EndIf
$iScrTime = Number(StringFormat('%04d%02d%02d%02d%02d%02d', $aFT[2], $aFT[0], $aFT[1], $aFT[3], $aFT[4], $aFT[5]))
EndIf
EndIf
EndFunc ;==>MainScript
Func _NTP_FT($sServer, $fLocal = True) ; Параметр $fLocal: True - возвращается локальное время
;~ False - возвращается время UTC
;~ Тема: http://autoit-script.ru/index.php?topic=20487.0
;~ Справка: http://book.itep.ru/4/44/sntp4416.htm
Local $tNTP = DllStructCreate('byte Header[4];byte RootDelay[4];byte RootDispersion[4];byte ReferenceIdentifier[4];byte ReferenceTimestamp[8];byte OriginateTimestamp[8];byte ReceiveTimestamp[8];byte TransmitTimestamp[8];byte KeyIdentifier[4];byte MessageDigest[16]')
Local $tPacket = DllStructCreate('byte Packet[68]', DllStructGetPtr($tNTP))
Local $bPacket = 0, $tFT, $tQW, $aSocket, $aResult
$tNTP.Header = Binary('0x1B000000')
UDPStartup()
If @error Then Return SetError(1, 0, 0)
$aSocket = UDPOpen(TCPNameToIP($sServer), 123)
If Not @error Then
UDPSend($aSocket, $tPacket.Packet)
If Not @error Then
While 1
$bPacket = UDPRecv($aSocket, 68, 1)
If (@error) Or ($bPacket) Then ExitLoop
Sleep(100)
WEnd
EndIf
EndIf
UDPCloseSocket($aSocket)
UDPShutdown()
If Not $bPacket Then Return SetError(2, 0, 0)
$tFT = DllStructCreate($tagFILETIME)
$tQW = ($fLocal ? DllStructCreate('uint64 Timestamp') : DllStructCreate('uint64 Timestamp', DllStructGetPtr($tFT)))
$tPacket.Packet = $bPacket
;~ $tQW.Timestamp = _WinAPI_SwapDWord(DllStructGetData(DllStructCreate('uint', DllStructGetPtr($tNTP, 'TransmitTimestamp')), 1)) * 10000000 + 94354848000000000
$tQW.Timestamp = Dec(StringMid(DllStructGetData($tNTP, 'TransmitTimestamp'), 3, 8), 2) * 10000000 + 94354848000000000
If $fLocal Then
$aResult = DllCall('kernel32.dll', 'bool', 'FileTimeToLocalFileTime', 'struct*', $tQW, "struct*", $tFT)
If (@error) Or (Not $aResult[0]) Then Return SetError(3, 0, 0)
EndIf
Return $tFT
EndFunc ;==>_NTP_FT