garkin
Не уверен, что точно понял Вашу ситуацию, но вот такая идея: у функций SendMessage и PostMessage есть два параметра — lParam и wParam. Вот уже два числа. Можно, например, зарегистрировать в обоих скриптах оконное сообщение с одним и тем же именем, и в нём потом пересылать PID и указатель (ReadAddress). А можно и два сообщения создать, в одном пересылать PID, а в другом — адрес данных и их размер.
Передающий скрипт:
Data =
(
Я теперь скупее стал в желаньях,
Жизнь моя, иль ты приснилась мне?
Словно я весенней гулкой ранью
Проскакал на розовом коне.
)
WinTitle := "Окно №1" ; Заголовок целевого окна.
PID := DllCall("GetCurrentProcessId")
MsgPID := DllCall("RegisterWindowMessage", "Str", "MsgPID")
MsgData := DllCall("RegisterWindowMessage", "Str", "MsgData")
F11:: ; Посылать по нажатию F11.
hWnd := WinExist(WinTitle)
If not hWnd {
MsgBox, Не найдено окно:`n%WinTitle%.
Return
}
wParam := PID
lParam := 0 ; Сюда тоже что-нибудь можно положить.
PostMessage, MsgPID, wParam, lParam,, ahk_id %hWnd% ; Посылаем PID.
wParam := &Data
lParam := StrLen(Data) + 1 ; Учитываем нулевой байт в конце строки.
PostMessage, MsgData, wParam, lParam,, ahk_id %hWnd% ; Адрес данных и размер.
Return
Принимающий скрипт:
WinTitle := "Окно №1"
MsgPID := DllCall("RegisterWindowMessage", "Str", "MsgPID")
MsgData := DllCall("RegisterWindowMessage", "Str", "MsgData")
OnMessage(MsgPID, "GetPID") ; Регистрация функций для обработки сообщений.
OnMessage(MsgData, "GetData")
Gui, Show, w400 h300, %WinTitle%
Return
GetPID(wParam, lParam, uMsg, hWnd)
{
Global PID := wParam
}
GetData(wParam, lParam, uMsg, hWnd)
{
Global PID
ReadAddress := wParam ; Адрес, откуда читать.
ReadSize := lParam ; Сколько байт считывать.
VarSetCapacity(Buf, ReadSize, 0) ; Буфер, куда считывать.
PROCESS_VM_READ := 0x10 ; Права на процесс.
hProcess := DllCall("OpenProcess", UInt, PROCESS_VM_READ
, Int, False
, UInt, PID)
If(!hProcess) {
MsgBox, Не удалось открыть процесс.
Return
}
Ret := DllCall("ReadProcessMemory", UInt, hProcess
, UInt, ReadAddress
, UInt, &Buf
, UInt, ReadSize
, UInt, 0)
DllCall("CloseHandle", UInt, hProcess) ; Освобождение хэндла процесса.
If(!Ret) {
MsgBox, Не удалось прочитать.
Return
}
VarSetCapacity(Buf, -1) ; Обновление размера переменной, поскольку запись в неё
; произошла со стороны и AutoHotkey об этом не знает.
MsgBox, %Buf%
}
GuiClose:
ExitApp