1

Тема: AHK : Как обмениваться сообщениями между скриптами?

Господа, подскажите как можно обмениватся сообщениями между скриптами, например как вызвать функцию с параметрами в другом заранее определённом скрипте, или хотя-бы без параметров?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

2

Re: AHK : Как обмениваться сообщениями между скриптами?

Вот так, например.

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

3

Re: AHK : Как обмениваться сообщениями между скриптами?

teadrinker пишет:

Вот так, например.

Спасибо что откликнулись!
Т.е. в скрипте приёмнике - OnMessage(0x4a, "Receive_WM_COPYDATA") 0x4a - задаёт имя сообщения, Receive_WM_COPYDATA - задаёт функцию которая будет вызвана при получении этого сообщения?

В скрипте отправителе - TargetScriptTitle = Receiver.ahk ahk_class AutoHotkey это вроде то, куда собственно отправлять. А если нет GUI? И Receiver.ahk указан без пути, т.е. скрипты должны лежать в одной папке, а если путь не может быть известен?
Так понял что сам посыл производит команда SendMessage из функции Send_WM_COPYDATA, а все танцы в ней вокруг обработки текста из InputBox.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4

Re: AHK : Как обмениваться сообщениями между скриптами?

А если нет GUI?

А GUI есть. Скрытое окно скрипта, вызываемое KeyHistory, ListLines и т.д. Запустите произвольный скрипт, откройте это окно, посмотрите в его заголовок, сравните со строкой записанной в TargetScriptTitle

5

Re: AHK : Как обмениваться сообщениями между скриптами?

serzh82saratov пишет:

в скрипте приёмнике - OnMessage(0x4a, "Receive_WM_COPYDATA") 0x4a - задаёт имя сообщения, Receive_WM_COPYDATA - задаёт функцию которая будет вызвана при получении этого сообщения?

Да, только 0x4a — это не имя, а уникальный код сообщения WM_COPYDATA.

serzh82saratov пишет:

А если нет GUI?

По-крайней мере одно окно есть у всех AHK-скриптов. Изначально оно скрыто, его можно увидеть, сделав двойной клик по иконке скрипта в трее, или выполнив команду Open из трей-меню. В заголовке этого окна присутствует путь к файлу скрипта, соответственно и его название, поэтому чтобы обратиться к такому окну, достаточно названия, если указать SetTitleMatchMode 2.

serzh82saratov пишет:

а все танцы в ней вокруг обработки текста из InputBox.

Главные танцы в ней вокруг создания структуры CopyDataStruct, указатель(поинтер) на которую, собственно, и посылается.

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

6

Re: AHK : Как обмениваться сообщениями между скриптами?

Получилось запустить функцию, и передать в wParam простое число.

Да, только 0x4a — это не имя, а уникальный код сообщения WM_COPYDATA.

Скажите, а можно просто посылать текст в lParam или в wParam без танцев. В русской справке нашёл:

Начиная с версии 1.0.40.05 строка в кавычках (литеральная строка) также может быть послана; оператор & в этом случае не используется. Например:
Run Notepad
WinWait Безымянный - Блокнот
SendMessage, 0xC, 0, "Новый заголовок окна" ; 0XC означает сообщение WM_SETTEXT

Конечно попробовал заменить 0x4a на 0xC, но ничего не вышло. И ещё можно-ли передать например 10 параметров, или всё нужно запихивать в lParam.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7

Re: AHK : Как обмениваться сообщениями между скриптами?

WM_SETTEXT работает. Вот пример.

Получатель сообщения.

OnMessage(0xC, "GetText")

GetText(wParam, lParam, msg, hwnd)
{
    MsgBox, % StrGet(lParam)
    Return 1
}

Отправитель.

Receiver = D:\SomeScript.ahk    ; Путь к получателю.
DetectHiddenWindows, On

F11::
    SendMessage, 0xC, 0, "Hello, world!",, %Receiver%
Return

8 (изменено: serzh82saratov, 2012-10-30 21:30:14)

Re: AHK : Как обмениваться сообщениями между скриптами?

Спасибо. WM_SETTEXT работает, не знал про StrGet.
1. Ещё вопрос, в GetText(wParam, lParam, msg, hwnd) указано 4 параметра, зачем? Тут что-то должно быть в строгом соответствии с WM_SETTEXT в WinApi?
2. Так понял, что передать десяток параметров можно только в lParam, и разбирать его потом в функции получателя?
3. В wParam можно передавать только шестнадцатиричные цифры?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK : Как обмениваться сообщениями между скриптами?

serzh82saratov
Да, должно быть 4 параметра, так положено. Про wParam написано, что он не используется, но числа в нём, оказывается, передать можно. Я и не знал.
В параметре msg будет код сообщения. В данном случае 0xC. Т.е. эту функцию GetText можно назначить как перехватчик для нескольких сообщений и по msg она определит, для какого сообщения вызвана. Hwnd — идентификатор окна, которому поступило сообщение.

Про несколько параметров вы верно мыслите. Можно в строку их соединить, а в получателе разделить. Можно и имя функции таким образом передать, которую нужно вызвать в получателе. Вот так, например.

Отправитель.

Receiver = D:\SomeScript.ahk
DetectHiddenWindows, On

F11::
    Params = Func1|Hello, world!|0x888
    SendMessage, 0xC, 0, &Params,, %Receiver%
Return

Получатель.

OnMessage(0xC, "GetText")

GetText(wParam, lParam, msg, hwnd)
{
    Params := StrGet(lParam)
    StringSplit, Param, Params, |
    MsgBox, Параметры GetText:`n%Param1%`n%Param2%`n%Param3%
    %Param1%(Param2, Param3)    ; Вызов функции по переданному имени.
    Return 1
}

Func1(p1, p2)
{
    MsgBox, Параметры Func1:`n%p1%`n%p2%
}

10

Re: AHK : Как обмениваться сообщениями между скриптами?

YMP
Спасибо, теперь всё ясно

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK : Как обмениваться сообщениями между скриптами?

YMP пишет:

Да, должно быть 4 параметра, так положено.

На самом деле не обязательно. Можно указывать меньше параметров, вплоть до того, который нужен. Т. е. если msg и hwnd не используются, можно указать только wParam и lParam:

OnMessage(0xC, "GetText")

GetText(wParam, lParam)
{
    Params := StrGet(lParam)
    StringSplit, Param, Params, |
    MsgBox, Параметры GetText:`n%Param1%`n%Param2%`n%Param3%
    %Param1%(Param2, Param3)    ; Вызов функции по переданному имени.
    Return 1
}

Func1(p1, p2)
{
    MsgBox, Параметры Func1:`n%p1%`n%p2%
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK : Как обмениваться сообщениями между скриптами?

teadrinker
Да, это я погорячился. Надо было дальше справку прочитать. Честно говоря, не помню даже, использовал ли я OnMessage в своём коде когда-нибудь. Теория без практики слаба.