Что нового

Коммуникация между процессами

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
AutoIt: Production Version: 3.3.8.1
Версия: 1.0

Категория: Интеракция, Процессы, Сообщений, Коммуникация

Описание: UDF позволяет организовать коммуникацию между вашими приложениями.
Сообщения отсылаются методом POST сразу всем окнам, которые зарегистрировали одинаковый идентификатор.

Функция может пригодиться в тех случаях, когда запускаются несколько копий приложений для синхронизации действий, или же требуется наладить связь между приложениями которые должны получать сообщения одновременно.

Т.к методом Post нельзя отослать текст, строку, массив и т.п., то Вы должны придумать, как приложение будет реагировать на сообщения. Можно отсылать числа, которые будет понятны только вам, или же можно отсылать HWND контрола, в котором будет находиться нужный текст, или же это может быть указатель на общий блок памяти и т.д.
Все сообщения должны иметь тип PTR.

Вызовите где-нибудь в начале вашего скрипта _Communication_Init и передайте 2 параметра:
[list type=decimal]
[*]HWND окна вашей программы. Если окна нет, то создайте скрытое.
[*]Имя функции, которая будет вызываться при приеме сообщений.
[/list]
Функция должна принимать 2 параметра: 1) HWND окна, которое прислало сообщение, 2) Само сообщение.

Для отсылки сообщений вызывайте функцию _Communication_Send(Данные)

Пример ниже показывает, как подключить библиотеку и отсылать текст. Идея в том, что отсылается HWND контрола содержащий текст.
Запустите пример несколько раз, что бы открылось много копий, введите нужный текст и нажмите кнопку Send.

Код/Пример:
Код:
#include 'communication.au3'

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 513, 407, 283, 265)
$Edit1 = GUICtrlCreateEdit("", 8, 8, 497, 361)
$Input1 = GUICtrlCreateInput("", 8, 376, 400, 21)
$Button1 = GUICtrlCreateButton("Send", 424, 376, 75, 25, $BS_DEFPUSHBUTTON)
GUISetState(@SW_SHOW)
WinSetTitle($Form1, '', $Form1)

;Подключаем коммуникацию. Функция __DataRes будет вызываться при приходе сообщений.
;Функция должна принимать 2 параметра
_Communication_Init($Form1, '__DataRes')

$hCtrl = GUICtrlGetHandle($Input1)
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			;Отсылаем HWND контрола в котором содержится текст
			_Communication_Send($hCtrl)
	EndSwitch
WEnd

Func __DataRes($hWndFrom = 0, $sMsg = 0)
	;$hWndFrom - сообщение от этого окна
	;Само сообщение
	;Т.к мы в сообщение отсылаем HWND контрола, то получим из него текст.
	$sText = ControlGetText($hWndFrom, '', $sMsg)
	GUICtrlSetData($Edit1, 'Сообщение от ' & $hWndFrom & ': ' & $sText & @CRLF, 1)
EndFunc   ;==>__DataRes

Файл: communication.au3

История версий:
1.0 Первая версия

Автор(ы):Inververs
 
Верх