; #NoTrayIcon
SetBatchLines, -1
SetWinDelay, 0
SS_BLACKRECT := 0x4, AW_HIDE := 0x10000, AW_SLIDE := 0x40000
AW_VER_POSITIVE := 0x4, AW_VER_NEGATIVE := 0x8, Titlehight := 12
if url := SyncLocalTime()
{
Gui, -Caption +ToolWindow +Border +AlwaysOnTop +hwndhGui
Gui, Margin, 15, 10
Gui, Add, Text, % "vText1 y" Titlehight + 10, Время успешно синхронизировано с сервером
GuiControlGet, Text1, Pos
Gui, Add, Text, % "x0 y0 w" Text1W + 30 " h" Titlehight " +" SS_BLACKRECT ; серая полоска сверху
Gui, Font,, Verdana
Gui, Add, Link, % "x" Text1X + 1 " y" Text1Y + Text1H + 2 " w" Text1W " h" Text1H
, % "<a href=""" . url . """>" . RegExReplace(url, ".+//([^/]+).*", "$1") . "</a>"
Gui, Font
Gui, Font, s22 q4
Gui, Add, Text, vText2 c0055AA center y+7 w%Text1W%, % RegExReplace(str := GetTimeString(), "(.*)\R.*", "$1")
Gui, Font
Gui, Add, Text, vText3 x15 y+22, % RegExReplace(str, ".*\R(.*г).*", "$1.")
Gui, Add, Button, % "Default h21 w66 y+-21 x" . Text1X + Text1W - 66, OK
GuiControl, Focus, Button1
Gui, Show, % "Hide w" Text1W + 30
DetectHiddenWindows, On
WinGetPos,,, GuiW, GuiH, ahk_id %hGui%
WinGetPos, X, Y, W, H, ahk_class Shell_TrayWnd
Gui, Show, % "Hide x" X + W - GuiW - 5 " Y" Y - GuiH - 5 ; указать опцию Hide и не указывать опцию NA
DllCall("AnimateWindow", Ptr, hGui, UInt, 0, UInt, AW_SLIDE|AW_VER_NEGATIVE) ; иначе не сработает DllCall("AnimateWindow")
SetTimer, TimeUpdate, 200
SetTimer, GuiClose, -6000
}
else
ExitApp
Return
TimeUpdate:
str := GetTimeString()
substr1 := RegExReplace(str, "(.*)\R.*", "$1")
substr2 := RegExReplace(str, ".*\R(.*г).*", "$1.")
Loop 2
if (substr%A_Index% != PrevStr%A_Index%)
GuiControl,, % "Text" . A_Index + 1, % substr%A_Index%
Loop 2
PrevStr%A_Index% := substr%A_Index%
Return
GuiClose:
GuiEscape:
ButtonOK:
SetTimer, TimeUpdate, Off
Sleep, 200
DllCall("AnimateWindow", Ptr, hGui, UInt, 0, UInt, AW_SLIDE|AW_VER_POSITIVE|AW_HIDE)
ExitApp
SyncLocalTime()
{
if Time := GetTimeDate(url) ; в перемменной Time время в формате YYYYMMDDHH24MISS
res := ChangeLocalTime(Time)
if !(Time && url && res)
{
MsgBox, Не удалось установить время. Прежние настройки сохранены.
Return
}
Return url
}
GetTimeDate(ByRef UsedUrl)
{
oServers := [ { url: "http://time100.ru"
, pattern: "U)<div class=""text-center maintime"".+</span>.+(\d\d:\d\d:\d\d).+сегодня:.+(\d+\D+\d+?)" }
, { url: "http://www.timeanddate.com/worldclock/russia/moscow"
, pattern: "U)id=ct class=h1>(.+)</span>.+id=ctdat>.+(\d.+)</span>" } ]
for k, v in oServers
ServerString .= v.url . "`n"
for k, srv in oServers
{
if !Ping(server := RegExReplace(url := srv.url, ".+//([^/]+).*", "$1"))
{
if (A_Index = oServers.MaxIndex())
{
WinClose, ahk_id %hToolTip%
MsgBox, % "Не удалось сязаться с указанными серверами:`n`n" . ServerString . "`nПроверьте подключение к интернету!"
Return
}
continue
}
try html := GetHtmlText(url)
catch
{
TrayTip,, Ошибка при подключении к серверу`n%url%
if (A_Index = oServers.MaxIndex())
{
WinClose, ahk_id %hToolTip%
MsgBox, % "Не удалось сязаться с указанными серверами:`n`n" . ServerString . "`nПроверьте подключение к интернету!"
Return
}
continue
}
RegExMatch(html, srv.pattern, found)
if !(found1 && found2)
{
MsgBox, 52,, Ошибка парсинга html-текста. Проверьте html c адреса`n`n%url%`nПродолжить?
IfMsgBox, Yes
continue
Return
}
for month, v in ["янв", "февр", "мар", "апр", "ма", "июн", "июл", "авг", "сен", "окт", "ноя", "дек"]
if InStr(RegExReplace(found2, ".+?([а-я]+).*", "$1"), v) = 1
break
year := RegExReplace(found2, ".+(\d{4}).*", "$1")
month := SubStr("0" . month, -1)
day := SubStr("0" . RegExReplace(found2, "(\d+).+", "$1"), -1)
hour := RegExReplace(found1, "(\d+).+", "$1")
min := RegExReplace(found1, ".+?:(\d+).+", "$1")
sec := RegExReplace(found1, ".+?:.+?:(\d+).*", "$1")
TimeFormatVar := year . month . day . hour . min . sec ; перемменная в формате YYYYMMDDHH24MISS
TimeFormatVar += 1, Seconds ; прибавляем 1 секунду для компенсации задержки
if !TimeFormatVar
{
MsgBox, 52,, Ошибка парсинга html-текста. Проверьте html c адреса`n`n%url%`nПродолжить?
IfMsgBox, Yes
continue
Return
}
UsedUrl := url
Return TimeFormatVar
}
}
GetHtmlText(url)
{
WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WebRequest.Open("GET", url)
WebRequest.Send()
Return WebRequest.ResponseText
}
Ping(strHost)
{
oWMI := ComObjGet("winmgmts:")
Loop 2
bRet := oWMI.Get("Win32_PingStatus.address='" . strHost . "'").StatusCode = 0
until bRet
return bRet
}
ChangeLocalTime(Time)
{
VarSetCapacity(SYSTEMTIME, 16)
Loop 6
{
number := A_Index = 1 ? SubStr(Time, 1, 4) : SubStr(Time, 3 + 2*(A_Index - 1), 2)
offset := A_Index = 1 ? 0 : A_Index = 2 ? 2 : 2*A_Index
NumPut(number, SYSTEMTIME, offset, "UShort")
}
Return SetLocalTime(&SYSTEMTIME)
}
SetLocalTime(pSYSTEMTIME)
{
Loop 2
if !DllCall("SetLocalTime", Ptr, pSYSTEMTIME) && Error := 1 {
WinClose, ahk_id %hToolTip%
MsgBox, Не удалось установить время. Ошибка %A_LastError%
break
}
Return !Error
}
GetTimeString()
{
month := ["января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"]
Return A_Hour ":" A_Min ":" A_Sec . "`n" . A_DDDD . ", " . A_DD . " " . month[A_MM] . " " . A_YEAR . " года"
}