Вы можете задать любой вопрос по программе Autohotkey в нашей группе Вконтакте. Если решение требует более высокой квалификации- можно обратиться непосредственно ко мне.
Группа Вконтакте | Электронная почта | Симаков Яков ВК |
Создает машинный адрес, при обращении к которому вызов перенаправляется к одной из функций в скрипте.
Address | При успехе функция RegisterCallback() возвращает числовой адрес, который можно использовать при помощи функции DllCall() или чего-либо еще, имеющего способность обращаться к машинной функции. При неудаче возвращает пустую строку. Неудача случается, когда FunctionName: 1) не существует; 2) принимает количество параметров, не совпадающее с ParamCount; или 3) принимает какой-либо из параметров ByRef (по ссылке). |
FunctionName | Представляет собой имя функции. Если имеет буквальное значение, заключается в кавычки. Данная функция вызывается автоматически при каждом обращении к адресу Address и принимает параметры, которые передаются по адресу Address. |
Options | Задайте ни одной или несколько опций, указанных ниже. Опции отделяются между собой при помощи пробела. Например: "C Fast". Fast или F: помогает избежать создания нового потока при каждом вызове функции FunctionName. Хотя это повышает производительность, использования этих опций следует избегать в тех случаях, когда Address вызывается из другого потока (т.е. когда обратный вызов запускается входящим сообщением), поскольку FunctionName сможет изменить такие глобальные настройки, как ErrorLevel, A_LastError и последнее найденное окно для любого потока, работающего во время вызова. (См. также примечания.) CDecl или C: приводит Address в соответствие с соглашением о вызовах "Cи" ("C" calling convention). Данные опции обычно опускаются, поскольку в обратных вызовах чаще всего используется стандартное соглашение о вызовах. |
ParamCount | Количество параметров, которые передает программа, вызывающая Address. Если данная опция опущена, по умолчанию в описании FunctionName устанавливается необходимое обязательное количество параметров. В любом случае, убедитесь, что вызывающая программа передает точное число параметров. |
EventInfo | Целое число между 0 и 4294967295, которое FunctionName будет видеть в A_EventInfo каждый раз, когда функция вызывается посредством Address. Это удобно, если FunctionName вызывается несколько раз. Если данный параметр опущен, по умолчанию он равен адресу Address. Примечание: в отличие от других глобальных настроек, режим fast не затрагивает A_EventInfo текущего потока. |
Функция, прикрепленная к адресу обратного вызова, может принимать до 31 параметра. Разрешены опциональные параметры, что весьма удобно, если к функции обращаются несколько вызывающих программ.
Все входящие параметры являются целыми числами и принадлежат к диапазону от 0 до 4294967295. Если входящий параметр должен быть целым числом со знаком, отрицательные числа можно задать следующим образом:
Если входящий параметр должен быть строкой, эту строку можно извлечь, скопировав ее в переменную. Например:
Если входящий параметр является адресом структуры, части этой структуры можно извлечь, следуя инструкциям, описанным в статье "DllCall()".
Если функция использует Return без каких-либо параметров или с пустым значением (например, ""), или не использует Return вообще, вызывающей адрес Address программе возвращается 0. Иначе, функция должна вернуть целое число в диапазоне от 2147483648 до 4294967295, которое затем возвращается вызывающей адрес Address программе.
При режиме default/slow, функция начинает работать заново со значениями настроек по умолчанию, такими, как SendMode и DetectHiddenWindows. Значения по умолчанию можно изменить в секции автовыполнения скрипта.
В противоположность режиму default/slow, режим fast mode наследует глобальные настройки от исполняемого в момент вызова функции потока. Кроме того, любые изменения, которые функция вносит в глобальные настройки, вступят в силу для текущего потока. Следовательно, режим fast mode можно использовать только тогда, когда точно известно, из какого потока (потоков) будет вызвана функция.
Чтобы не прерывать себя самому (или другим потоком), обратный вызов в качестве первой строки может использовать Critical. Однако, если функция вызывается непрямым образом, а посредством прибываемого сообщения размером менее 0x312, такой метод эффективен не на 100% (здесь может помочь увеличение интервала Critical). Кроме того, Critical не предотвращает действия функции, могущие косвенно привести к самовызову, например, к вызову SendMessage или DllCall.
Каждый вызов функции RegisterCallback() резервирует небольшое количество памяти (32 байта плюс память, необходимую для системных операций). Так как операционная система автоматически освобождает память по завершении работы скрипта, скрипты, которые делают небольшое, фиксированное количество обратных вызовов, не должны явно освобождать память. В отличие от этого, скрипты, вызывающие функцию RegisterCallback() бесконечное/неограниченное число раз, должны явно вызывать DllCall("GlobalFree", UInt, Address) на любом неиспользуемом обратном вызове.