Тема: AHK: Как изменить время и дату в системе?
Как изменить время и дату в системе?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как изменить время и дату в системе?
Pogodin, ознакомьтесь с этой темой, отредактируйте заголовок.
Изв, исправил.
Пример. Устанавливаем 17:30 восьмого числа текущего месяца:
; Параметры, которые хотим изменить
Day := 8 ; число от 1 до 31
Hour := 17 ; число от 1 до 23
Min := 30 ; число от 1 до 59
; Получаем текущие настройки времени
VarSetCapacity(SYSTEMTIME, 16)
DllCall("GetLocalTime", Ptr, &SYSTEMTIME)
; Изменяем необходимые параметры, заполняя нужные поля структуры SYSTEMTIME в соответствии с описанием:
; http://msdn.microsoft.com/en-us/library/windows/desktop/ms724950%28v=vs.85%29.aspx
NumPut(Day, SYSTEMTIME, 6, "UShort")
NumPut(Hour, SYSTEMTIME, 8, "UShort")
NumPut(Min, SYSTEMTIME, 10, "UShort")
if !DllCall("SetLocalTime", Ptr, &SYSTEMTIME)
MsgBox, Не удалось установить время. Ошибка %A_LastError%
Return
Почему-то упорно не хочет работать со значениями меньше 10.
Не подходит ни один из вариантов.
Min := 9
Min = 09
Min := "09"
Как назначить правильно?
Правильно Min := 9 (в примере есть Day := 8), всё должно работать, если код верный.
Работает, но иногда почему-то, срабатывает с поправкой на 1 минуту.
Порылся в "золотом фонде" и не нашёл готового кода для временного изменения даты и времени. Неужели никто не брался за такую, я бы сказал популярную задачу?
Сам попробовал, всё криво получается, проверки переполнения "24" или "60" как-то уж совсем по варварски. А чтобы пользоваться EnvSub, надо, наверное, Гарвард окончить.
Нет ли у кого под рукой готового кода для таких целей? Или может кто-то захочет написать его сам?
Сама задача проста:
1. Определение времени
2. Перевод времени и даты на заранее заданные параметры
3. Запуск блокнота
4. Через заданный промежуток времени перевод даты и времени назад с учётом прошедшего времени.
И дополнительные опции:
1. Выход по горячей клавише до окончания заранее заданного срока, с возвратом даты и времени(с учётом прошедшего времени)
2. Пауза в работе по горячей клавише и последующий перерасчёт времени и даты, если по выходу превышен заранее заданный промежуток времени.
Так я не пойму, код выше для вас не годится? Но другого нет.
Код годится. Речь сейчас не о самой операции по смене датывремени, а об общем алгоритме:
Сама задача проста:
1. Определение времени
2. Перевод времени и даты на заранее заданные параметры
3. Запуск блокнота
4. Через заданный промежуток времени перевод даты и времени назад с учётом прошедшего времени.И дополнительные опции:
1. Выход по горячей клавише до окончания заранее заданного срока, с возвратом даты и времени(с учётом прошедшего времени)
2. Пауза в работе по горячей клавише и последующий перерасчёт времени и даты, если по выходу превышен заранее заданный промежуток времени.
PS. Если надо, можно вынести в отдельную тему, но мне кажется, что здесь вполне подходит.
Может проще поменять дату изменения или создания документа, который редактировался в блокноте... Если я правильно понял.
Не правильно. ) Дата должна временно меняться для запускаемой программы, будь то блокнот или что-то другое.
Дата должна временно меняться для запускаемой программы
Вообще-то это противоречит правилам форума. Попозже опишу принцип изменения системного времени туда-обратно, а уж как применить, сами думайте.
Pogodin пишет:Дата должна временно меняться для запускаемой программы
Вообще-то это противоречит правилам форума.
Ну, так это же с целью "нехорошей", а я как раз наоборот, пытаюсь защитить свою программу от таких трюков. ) А как защитить не имея нужного инструментария? Или, если он есть, но в моём исполнении кривой?
Попозже опишу принцип изменения системного времени туда-обратно, а уж как применить, сами думайте.
Спасибо!
Запускаем скрипт и отправляемся в 17:30 восьмого января текущего года. При выходе (клавиша Esc) возвращаемся в настоящее время.
; указываем только те параметры, которые хотим изменить, остальные ""
oTime := { year: "" ; число от 1601 до 30827
, month: 1 ; 1 — 12
, day: 8 ; 1 — 31
, hour: 17 ; 0 — 23
, min: 30 ; 0 — 59
, sec: "" } ; 0 — 59
StartTickCount := A_TickCount
StartTime := GetLocalTime() ; в переменной StartTime время начала работы скрипта в формате YYYYMMDDHH24MISS
ChangeLocalTime(oTime) ; изменяем параметры, указанные в oTime
OnExit, Exit
Return
Exit:
RetrieveLocalTime(StartTime, StartTickCount) ; при выходе возвращаем настройки с учётом прошедшего времени
ExitApp
Esc:: ExitApp
GetLocalTime()
{
pSYSTEMTIME := GetLocalTimeStruct() ; Получаем текущие настройки времени
Loop 6 ; Преобразуем их в формат YYYYMMDDHH24MISS
{
num := NumGet(pSYSTEMTIME + 2*(A_Index - (A_Index < 3 ? 1 : 0)), "UShort")
TimeFormatVar .= (A_Index = 1 ? num : SubStr("0" . num, -1))
}
Return TimeFormatVar
}
ChangeLocalTime(oTime)
{
pSYSTEMTIME := GetLocalTimeStruct() ; Получаем текущие настройки времени
for k, v in ["year", "month", "day", "hour", "min", "sec"] ; Изменяем необходимые параметры
if (oTime[v] != "")
NumPut(oTime[v], pSYSTEMTIME + 2*(A_Index - (A_Index < 3 ? 1 : 0)), "UShort")
Return SetLocalTime(pSYSTEMTIME) ; устанавливаем новое время
}
RetrieveLocalTime(Time, StartTickCount)
{
Time += Round((A_TickCount - StartTickCount)/1000), Seconds ; прибавляем разницу во времени с начала работы
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 : 2*(A_Index - (A_Index = 2 ? 1 : 0))
NumPut(number, SYSTEMTIME, offset, "UShort")
}
Return SetLocalTime(&SYSTEMTIME)
}
GetLocalTimeStruct()
{
static SYSTEMTIME
VarSetCapacity(SYSTEMTIME, 16, 0)
DllCall("GetLocalTime", Ptr, &SYSTEMTIME)
Return &SYSTEMTIME
}
SetLocalTime(pSYSTEMTIME)
{
Loop 2
if !DllCall("SetLocalTime", Ptr, pSYSTEMTIME) && Error := 1 {
MsgBox, Не удалось установить время. Ошибка %A_LastError%
break
}
Return !Error
}
Кстати, в коде выше был баг, возможно приводивший к ошибке: функцию DllCall("SetLocalTime") нужно вызывать дважды, как описано здесь, что и реализовано в этом варианте.
На время работы скрипта должна быть отключена синхронизация времени через интернет.
И, собственно, для защиты от такого трюка напрашивается метод получения времени через интернет. ))
Один из вариантов, с англоязычного форума.
MsgBox, % GetTimeDate()
GetTimeDate() {
WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WebRequest.Open("GET", "http://www.timeanddate.com/worldclock/russia/moscow")
WebRequest.Send()
return RegExReplace(WebRequest.ResponseText, "s).+id=ct class=h1>(.+?)</span>.+?id=ctdat>(.+?)</span>.+", "$1`n$2")
}
Для оффлайн проверки можно в папке %TMP% взять время изменения/создания файлов, если время в системе было переведено непосредственно перед использованием защищаемой программы, то (как правило) точность будет в пределах нескольких минут.
Да, тоже хотел это найти, но руки не дошли. Я бы ещё сначала проверил доступность сервера пингом.
А зачем изобретать велосипеды?
Уже есть куча программ, чтобы запускать другие программмы с определенного времени. Например RunAsDate от NirCmd.
В посте #13 внезапно выяснилось, что ТС хочет защитить свою программу от такого воздействия.
Вот пускай и использует готовый "инструментарий", который к тому же работает без перевода системных часов.
А зачем изобретать велосипеды?
Например RunAsDate от NirCmd.
Пробовал. Глючит люто. Решил, что самому сделать надёжнее. Но не одолел, прибежал к знатокам за помощью. Пока не тестировал, но всё равно спасибо всем помогающим!
Pogodin пишет:Дата должна временно меняться для запускаемой программы
Вообще-то это противоречит правилам форума.
По-моему, взломом и вредительством здесь не пахнет.
stealzy пишет:А зачем изобретать велосипеды?
Например RunAsDateПробовал. Глючит люто.
Пробовал. До сих пор пользуюсь. Ни разу не глючло.
По-моему, взломом и вредительством здесь не пахнет.
По моим представлениям, такое обычно применяется для бесконечного продления срока пользования триал-версией программы.
ypppu пишет:По-моему, взломом и вредительством здесь не пахнет.
По моим представлениям, такое обычно применяется для бесконечного продления срока пользования триал-версией программы.
И для разработки способов борьбы с этим трюком.
Код из 14 работает великолепно, за что огромное спасибо!
Пробовал. До сих пор пользуюсь. Ни разу не глючло.
Не знаю как так получается. У меня 1 раз из 3-4 обязательно "забывало" вернуть время.
По моим представлениям, такое обычно применяется для бесконечного продления срока пользования триал-версией программы.
Перевод времени вполне делается вручную (как сказал бы The gray Cardinal - "козлиная защита"). А упомянутая программа просто избавляет от ручных манипуляций, то бишь автоматизирует.
запрос такой: надо чтобы месяц 10 был число 10 а время также осталось
ruslanchus, добро пожаловать на форум! Ознакомьтесь, пожалуйста, с Правилами, отредактируйте свой пост. Обратите внимание на заглавные буквы в начале и точки в конце предложений.
Запросы лучше помещать в Коммерческий раздел.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться