1.发送消息程序A,关键代码:
procedure TForm2.Button1Click(Sender: TObject);
var
H:HWND;
begin
str:='哈哈哈';
H:=FindWindow('TForm1','Form1');
sendMessage(H,UWM_SHOWTEXT ,Integer(@str),0);
end;2.接收消息程序B,关键代码:
procedure UWMShowText(var Msg:TMessage); message UWM_SHOWTEXT;
procedure TForm1.UWMShowText(var Msg:TMessage);
begin
Edit1.Text:= String(Pointer(Msg.wParam)^);
end;
============================
这段代码如果都放到一个程序中执行能够得到正确结果,但在两个程序间执行时,Edit接收不到正确的字条串,请问高手如何解决???
procedure TForm2.Button1Click(Sender: TObject);
var
H:HWND;
begin
str:='哈哈哈';
H:=FindWindow('TForm1','Form1');
sendMessage(H,UWM_SHOWTEXT ,Integer(@str),0);
end;2.接收消息程序B,关键代码:
procedure UWMShowText(var Msg:TMessage); message UWM_SHOWTEXT;
procedure TForm1.UWMShowText(var Msg:TMessage);
begin
Edit1.Text:= String(Pointer(Msg.wParam)^);
end;
============================
这段代码如果都放到一个程序中执行能够得到正确结果,但在两个程序间执行时,Edit接收不到正确的字条串,请问高手如何解决???
使用该消息涉及一个 TcopyDataStruct结构类型的指针。该结构中有三个成员:dwData 是一个 32位的附加参数cbData 表示要传递的数据区的大小lpData 表示要传递的数据区的指针下面举个例子。该例子由两个程序构成,分别为 SendData和 GetData。SendData程序向 GetData程序发送消息,并传递 edit1中的字符串; GetData在收到消息后,把 SendData发送的字符串接受下来,并显示在相应的 edit1中。SendData程序:
……varForm1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);vards: TCopyDataStruct;hd: THandle;beginds.cbData := Length (Edit1.Text) + 1;GetMem (ds.lpData, ds.cbData ); //为传递的数据区分配内存 StrCopy (ds.lpData, PChar (Edit1.Text));Hd := FindWindow (nil, 'Form2'); // 获得接受窗口的句柄 if Hd <> 0 thenSendMessage (Hd, WM_COPYDATA, Handle,Cardinal(@ds)) // 发送 WM_COPYDATA消息 elseShowMessage ('目标窗口没找到! ');FreeMem (ds.lpData); //释放资源 end;GetData程序:
TForm2 = class(TForm)Edit1: TEdit;private{ Private declarations }publicprocedure Mymessage(var t:TWmCopyData);message WM_COPYDATA;{ Public declarations }end;varForm2: TForm2;implementationprocedure TForm2.Mymessage(var t:TWmCopyData);beginEdit1.text:=StrPas(t.CopyDataStruct^.lpData);//接受数据并显示。end;使用这种方法是 WIN32应用程序进行交互的最简单的方法。
var
SendData: tagCOPYDATASTRUCT; //TFormzycyjs
begin
//if GetLastError = ERROR_ALREADY_EXISTS then
begin
with SendData do
begin
cbData := Length(AMsg) + 1;
GetMem(lpData, cbData); //为传递的数据区分配内存
StrCopy(lpData, PChar(AMsg));
end; //TFormzycyjs 是前台住院结算窗口的类名
SendMessage(FindWindow(pchar(AFormCalssName),nil), WM_COPYDATA, 0, integer(@SendData));
Application.ProcessMessages;
FreeMem(SendData.lpData); //释放资源
end;
end;
接受procedure TFormzycyjs.WMCopyData(var Msg: TWMCopyData);
var
str: string;
begin
str := Trim(strpas(Msg.CopyDataStruct.lpData));
StatusBar.Panels[1].Text:=str;
StatusBar.Refresh;
end;