SetMessageAction
SetMessageAction [/P] <msg/msgname> <cmd> [params]
Команда выполняет действия при получении заданного сообщения, отправленного окну Total Commander.
Параметры
<msg> <msgname> | Числовое значение номера сообщения или строка для регистрации пользовательского номера сообщения. |
<cmd> | Строка с именем внутренней команды Autorun или пользовательской функции. |
<params> | Параметры команды или пользовательской функции (если применимо). Дополнительная информация в примечаниях. |
Переключатели
/P | Опционально. При заданном переключателе к имеющимся параметрам команды будут добавлены четыре параметра, переданные в сообщении: hWnd, uMsg, wParam и lParam. |
Примечания
В первую очередь команда предназначена для выполнения пользовательской функции при отправке сообщения окну Total Commander из внешних источников. Команда может привязывать действие и к системным сообщениям, но невозможность их заблокировать, изменить или получить данные из сопутствующих структур ограничивает сферу такого применения.
Настоятельно рекомендуется использовать только пользовательские сообщения с номерами 0x400 (WM_USER) и выше, в этом случае функция не проверяет номера сообщений в зарезервированном системой диапазоне, что ускоряет работу. Используйте обработчики для зарезервированных системных сообщений только в случае реальной необходимости и если вы точно осознаёте, что делаете, поскольку это может замедлить или даже нарушить работу Total Commander.
При командной записи, если в параметрах вызываемой команды cmd есть вычисляемая строка, то она будет пересчитываться каждый раз при выполнении команды cmd. Напрямую реализовать такую логику в функциональной записи нельзя, поскольку в ней любые выражения в параметрах вычисляются только один раз в момент вызова SetMessageAction и не будут пересчитываться при выполнении привязанного действия. Таким образом, чтобы достигнуть результата, аналогичного использованию вычисляемых строк в командной записи, необходимо использовать в качестве команды дополнительную пользовательскую функцию, в которой выполнять требуемое выражение.
Всего можно привязать до 128 действий.
Пример
Код в конфигурации Autorun:
# Функция, которая будет выполнена при получении сообщения Func MyMessageFunc() MsgBox "Сообщение получено" EndFunc # Привязываем функцию к сообщению, регистрируемому строкой "MyMessage" SetMessageAction "MyMessage" MyMessageFunc # Можно привязать к фиксированному номеру, но этот вариант менее надежен, # поскольку случайным образом выбранный номер сообщения может пересечься # с уже используемым SetMessageAction 55555 MyMessageFunc
Cкрипт на Autoit, вызывающий функцию «MyMessageFunc» по регистрируемому номеру:
; Регистрируем сообщение, заданное строкой "MyMessage" $nMsg = DllCall("user32", "uint", "RegisterWindowMessageW", "wstr", "MyMessage")[0] ; Находим окно Total Commander $hWnd = WinGetHandle("[CLASS:TTOTAL_CMD]") ; Отправляем зарегистрированное сообщение окну Total Commander DllCall("user32", "lresult", "SendMessageW", "hwnd", $hWnd, _ "uint", $nMsg, _ "wparam", 0, _ "lparam", 0)
Вызов с помощью утилиты TCFS2 по фиксированному номеру:
TCFS2.exe /ef "msg(55555, 0, 0)"
По регистрируемому номеру:
TCFS2.exe /ef "msg(regmsg(MyMessage), 0, 0)"