Korobkof пишет:Насколько я понимаю, создается тот самый таймер
Да.
Korobkof пишет:ему передаются параметры - дважды 0 (что это?)
Первый- это указатель на атрибуты защиты, указывая ноль мы говорим, что особых атрибутов нам не надо, пусть будут по-умолчанию. Почти всегда передают ноль, более подробно стоит разбирать этот параметр только тем, кто всерьёз собирается программировать под windows.
Второй отвечает за сброс события: 0- автоматический сброс, 1- ручной. Если таймер используется только один раз, то не важно что передавать.
Korobkof пишет:"name" (как поясняет автор скрипта это - произвольное имя таймера; оно зачем - можно потом по нему обращаться к нему? или как?);
Не совсем произвольное- это имя объекта ядра. Нас оно не интересует, можно передавать ноль- тогда будет создан неименованный объект.
Korobkof пишет:"UInt", видимо, - тип возвращаемого значения (зачем оно и каким может быть?).
Да, это тип возвращаемого значения. Возвращается описатель(handle) созданного таймера, он нам необходим для дальнейшей работы с таймером. Тип должен быть "ptr", дальше будет пример, где все типы указаны правильно.
Korobkof пишет:Судя по слову "Cancel" и параметру, соответствующему ранее возвращенному значению, в зависимости от последнего таймер отменяется (отключается? уничтожается?). Это что-то типа ErrorLevel?
Скорее "отключается", т.е. объект "таймер" всё ещё существует и его можно использовать. Для уничтожения таймера нужно закрыть все хендлы функцией CloseHandle.
Korobkof пишет:Тут вообще понятно только относительно "duetime", это время срабатывания таймера в формате UTC-file-time. Что задают остальные передаваемые параметры?
1- ранее созданный таймер
2- либо дата первого срабатывания, либо промежуток через который таймер должен сработать, чтобы задать промежуток нужно передать отрицательное значение(например -50000000, означает через 5 секунд).
3- период срабатывания в миллисекундах. Т.е. после того как таймер сработает первый раз, он будет ещё и периодически срабатывать через указанный тут период. 0- значит не нужно периодического срабатывания.
4- функция завершения ожидания, в данном случае она нас не интересует из-за особенностей её срабатывания(поток должен быть в состоянии ожидания для её срабатывания)
5- параметр, который будет передан в функцию из четвёртого параметра
6- не помню, всегда ноль ставят .
Korobkof пишет:И что дает эта конструкция, выходных-то данных никаких нет? Или выполнение скрипта на этом месте останавливается до наступления указанного времени?
Функция возвращает 0 в случае неудачи, иначе таймер успешно установлен. Т.е. объект "таймер" перейдёт в сигнальное состояние в указанное время.
Korobkof пишет:Имеет ли этот участок кода отношение к таймеру и если да, то какое?
WaitForSingleObject- ожидает перехода таймера(на самом деле почти любого объекта) в сигнальное состояние.
CloseHandle- уничтожает таймер.
WaitForSingleObject блокирует поток до наступления события, а AHK не поддерживает многопоточность. Для выхода из этой ситуации можно воспользоваться функциями из этой темы(из второго поста).
Пример:
#persistent
DetectHiddenWindows On
WinGet, hWnd, id, % "ahk_classAutoHotkey ahk_pid" . DllCall("GetCurrentProcessId")
OnMessage(0x401, "DlgProc")
hTimer := DllCall("CreateWaitableTimer", "ptr", 0, "int", 1, "ptr", 0, "ptr")
if (hTimer == 0)
{
msgbox не удалось создать таймер
ExitApp
}
EventProc := CreateWaitFunc(hTimer, hWnd, 0x401)
liDueTime := -50000000
x := DllCall("SetWaitableTimer", "ptr", hTimer, "int64*", liDueTime, "int", 0, "ptr", 0, "ptr", 0, "int", 0)
if (!x)
{
msgbox не удалось установить таймер
ExitApp
}
DllCall("CloseHandle", "ptr", DllCall("CreateThread", "ptr", 0, "ptr", 0, "ptr", 0|EventProc, "ptr", 0, "uint", 0, "ptr", 0))
return
DlgProc(wParam, lParam, msg, hWnd)
{
global EventProc
if(msg==0x401)
{
msgbox таймер сработал
FreeWaitFunc(EventProc)
DllCall("CloseHandle", "ptr", wParam)
ExitApp
}
}