Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Пользователь


Сообщения: 135
Благодарности: 32

Профиль | Отправить PM | Цитировать


Передача строки другому приложению
Передающее приложение:

Код: Выделить весь код
#include <GuiConstants.au3>
;~ Global Const $WM_COPYDATA = 0x004A
$Gui = GUICreate("Отправитель",300,100)
$input = GUICtrlCreateInput("Привет!",10,10,280,20)
$button = GUICtrlCreateButton("Отправить",10,40,70,20)
GUISetState()

While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $button
			$HWnd = WinGetHandle("Получатель")
			If $HWnd <> "" And Not @error Then 
				SendMsg(GUICtrlRead($input), $HWnd, $Gui)
			Else
				MsgBox(16,"Отправитель","Получатель не обнаружен!")
			EndIf
	EndSwitch
WEnd

;~ $String       - Строка сообщения
;~ $HWnd_Grantee - Приложение получатель  (hwnd)
;~ $HWnd_Sender  - Приложение отправитель (hwnd)
Func SendMsg($String, $HWnd_Grantee, $HWnd_Sender = 0)
	Local Const $tagCopyData = "dword dwData;dword cbData;ptr lpData"
	Local $struct = "char [" & StringLen($String)+1 & "]"
	Local $p = DllStructCreate($tagCopyData)
	Local $StringMSG = DllStructCreate($struct)
	DllStructSetData($p, "dwData", "?") ; ?????
	DllStructSetData($p, "cbData", DllStructGetSize($StringMSG))  ; размер структуры $StringMSG
	DllStructSetData($p, "lpData", DllStructGetPtr($StringMSG))   ; указатель на структуру $StringMSG
	DllStructSetData($StringMSG, 1, $String) ; строка сообщения
	
	DllCall("user32.dll","long","SendMessage","hwnd",$HWnd_Grantee,"int",$WM_COPYDATA,"hwnd",$HWnd_Sender,"ptr",DllStructGetPtr($p))
EndFunc

Принимающее приложение:

Код: Выделить весь код
#include <GuiConstants.au3>
;~ Global Const $WM_COPYDATA = 0x004A
Global $ArrMessage[2]
$Gui = GUICreate("Получатель",300,100)
$Dummy = GUICtrlCreateDummy()
$Label = GUICtrlCreateLabel("",10,10,280,20)
GUIRegisterMsg($WM_COPYDATA,"WM_COPYDATA")
GUISetState(@SW_SHOW)

While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Dummy
			GUICtrlSetData($Label, $ArrMessage[0])
			;MsgBox(0, "Получатель", "Получено сообщение от " & $ArrMessage[1] & @LF & _ 
			;"Текст сообщения: " & $ArrMessage[0])
	EndSwitch
WEnd

Func WM_COPYDATA($HWnd,$MsgID,$wParam,$lParam)
	Local Const $tagCopyData = "dword dwData;dword cbData;ptr lpData"
	Local $p = DllStructCreate($tagCopyData, $lParam)   
	Local $struct = "char [" & DllStructGetData($p, "cbData") & "]" 
	Local $StringMSG = DllStructCreate($struct,  DllStructGetData($p, "lpData"))
	
	$ArrMessage[0] = DllStructGetData($StringMSG,1) ; Строка сообщения
	$ArrMessage[1] = $wParam ; Хэндл окна приложения отправителя
	GUICtrlSendToDummy($Dummy)
EndFunc


И собственно вопрос, что должен содержать первый элемент(dwData) у структуры tCopyData?

P.S.
Как передать-принять командную строку если скрипт которому её нужно передать уже работает? Я в начале предположил что это можно реализовать через WM_COPYDATA используя два процесса. Может есть какой нибудь специальный способ?

Отправлено: 05:38, 03-12-2007 | #808