1 (изменено: Pogodin, 2014-10-06 22:49:00)

Тема: AHK: Как изменить время и дату в системе?

Как изменить время и дату в системе?

2

Re: AHK: Как изменить время и дату в системе?

Pogodin, ознакомьтесь с этой темой, отредактируйте заголовок.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Как изменить время и дату в системе?

Изв, исправил.

4

Re: AHK: Как изменить время и дату в системе?

Пример. Устанавливаем 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
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: Pogodin, 2014-10-28 13:22:57)

Re: AHK: Как изменить время и дату в системе?

Почему-то упорно не хочет работать со значениями меньше 10.
Не подходит ни один из вариантов.
Min := 9
Min = 09
Min := "09"
  Как назначить правильно?

6

Re: AHK: Как изменить время и дату в системе?

Правильно Min := 9 (в примере есть Day := 8), всё должно работать, если код верный.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Как изменить время и дату в системе?

Работает, но иногда почему-то,  срабатывает с поправкой на 1 минуту.
  Порылся в "золотом фонде" и не нашёл готового кода для временного изменения даты и времени. Неужели никто не брался за такую, я бы сказал популярную задачу?

  Сам попробовал, всё криво получается, проверки переполнения "24" или "60" как-то уж совсем по варварски. А чтобы пользоваться  EnvSub, надо, наверное, Гарвард окончить.

Нет ли у кого под рукой готового кода для таких целей? Или может кто-то захочет написать его сам?
Сама задача проста:
1. Определение времени
2. Перевод времени и даты на заранее заданные параметры
3. Запуск блокнота
4. Через заданный промежуток времени перевод даты  и времени назад с учётом прошедшего времени.

   И дополнительные опции:
1. Выход по горячей клавише до окончания заранее заданного срока, с возвратом даты и времени(с учётом прошедшего времени)
2. Пауза в работе по горячей клавише и последующий перерасчёт времени и даты, если по выходу превышен заранее заданный промежуток времени.

8

Re: AHK: Как изменить время и дату в системе?

Так я не пойму, код выше для вас не годится? Но другого нет.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9 (изменено: Pogodin, 2014-11-12 16:48:40)

Re: AHK: Как изменить время и дату в системе?

Код годится. Речь сейчас не о самой операции по смене датывремени, а об общем алгоритме:

Сама задача проста:
1. Определение времени
2. Перевод времени и даты на заранее заданные параметры
3. Запуск блокнота
4. Через заданный промежуток времени перевод даты  и времени назад с учётом прошедшего времени.

   И дополнительные опции:
1. Выход по горячей клавише до окончания заранее заданного срока, с возвратом даты и времени(с учётом прошедшего времени)
2. Пауза в работе по горячей клавише и последующий перерасчёт времени и даты, если по выходу превышен заранее заданный промежуток времени.


PS. Если надо, можно вынести в отдельную тему, но мне кажется, что здесь вполне подходит.

10 (изменено: Alectric, 2014-11-12 18:56:51)

Re: AHK: Как изменить время и дату в системе?

Может проще поменять дату изменения или создания документа, который редактировался в блокноте... Если я правильно понял.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

11

Re: AHK: Как изменить время и дату в системе?

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

12

Re: AHK: Как изменить время и дату в системе?

Pogodin пишет:

Дата должна временно меняться для запускаемой программы

Вообще-то это противоречит правилам форума. Попозже опишу принцип изменения системного времени туда-обратно, а уж как применить, сами думайте.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13 (изменено: Pogodin, 2014-11-13 05:00:48)

Re: AHK: Как изменить время и дату в системе?

teadrinker пишет:
Pogodin пишет:

Дата должна временно меняться для запускаемой программы

Вообще-то это противоречит правилам форума.

   Ну, так это же с целью "нехорошей", а я как раз наоборот, пытаюсь защитить свою программу от таких трюков. )  А как защитить не имея нужного инструментария? Или, если он есть, но в моём исполнении кривой?

Попозже опишу принцип изменения системного времени туда-обратно, а уж как применить, сами думайте.

  Спасибо!

14

Re: AHK: Как изменить время и дату в системе?

Запускаем скрипт и отправляемся в 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") нужно вызывать дважды, как описано здесь, что и реализовано в этом варианте.
На время работы скрипта должна быть отключена синхронизация времени через интернет.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15

Re: AHK: Как изменить время и дату в системе?

И, собственно, для защиты от такого трюка напрашивается метод получения времени через интернет. ))
Один из вариантов, с англоязычного форума.

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%  взять время изменения/создания файлов, если время в системе было переведено непосредственно перед использованием защищаемой программы, то (как правило) точность будет в пределах нескольких минут.

16

Re: AHK: Как изменить время и дату в системе?

Да, тоже хотел это найти, но руки не дошли. Я бы ещё сначала проверил доступность сервера пингом.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17

Re: AHK: Как изменить время и дату в системе?

А зачем изобретать велосипеды?
Уже есть куча программ, чтобы запускать другие программмы с определенного времени. Например RunAsDate от NirCmd.

18

Re: AHK: Как изменить время и дату в системе?

В посте #13 внезапно выяснилось, что ТС хочет защитить свою программу от такого воздействия.

19

Re: AHK: Как изменить время и дату в системе?

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

20

Re: AHK: Как изменить время и дату в системе?

stealzy пишет:

А зачем изобретать велосипеды?
Например RunAsDate от NirCmd.

  Пробовал. Глючит люто. Решил, что самому сделать надёжнее. Но не одолел, прибежал к знатокам за помощью.  Пока не тестировал, но всё равно спасибо всем помогающим!

21

Re: AHK: Как изменить время и дату в системе?

teadrinker пишет:
Pogodin пишет:

Дата должна временно меняться для запускаемой программы

Вообще-то это противоречит правилам форума.

По-моему, взломом и вредительством здесь не пахнет.

Pogodin пишет:
stealzy пишет:

А зачем изобретать велосипеды?
Например RunAsDate

  Пробовал. Глючит люто.

Пробовал. До сих пор пользуюсь. Ни разу не глючло.

22

Re: AHK: Как изменить время и дату в системе?

ypppu пишет:

По-моему, взломом и вредительством здесь не пахнет.

По моим представлениям, такое обычно применяется для бесконечного продления срока пользования триал-версией программы.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

23

Re: AHK: Как изменить время и дату в системе?

teadrinker пишет:
ypppu пишет:

По-моему, взломом и вредительством здесь не пахнет.

По моим представлениям, такое обычно применяется для бесконечного продления срока пользования триал-версией программы.

     И для разработки способов борьбы с этим трюком.


  Код из 14 работает великолепно, за что огромное спасибо!


Пробовал. До сих пор пользуюсь. Ни разу не глючло.

  Не знаю как так получается. У меня 1 раз из 3-4 обязательно "забывало" вернуть время.

24

Re: AHK: Как изменить время и дату в системе?

teadrinker пишет:

По моим представлениям, такое обычно применяется для бесконечного продления срока пользования триал-версией программы.

Перевод времени вполне делается вручную (как сказал бы The gray Cardinal - "козлиная защита"). А упомянутая программа просто избавляет от ручных манипуляций, то бишь автоматизирует.

25

Re: AHK: Как изменить время и дату в системе?

запрос такой: надо чтобы месяц 10 был число 10 а время также осталось

26

Re: AHK: Как изменить время и дату в системе?

ruslanchus, добро пожаловать на форум! Ознакомьтесь, пожалуйста, с Правилами, отредактируйте свой пост. Обратите внимание на заглавные буквы в начале и точки в конце предложений.
Запросы лучше помещать в Коммерческий раздел.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder