Пользователь
Сообщения: 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 используя два процесса. Может есть какой нибудь специальный способ?
|