请问怎样通过WINDOWS消息传递比较大的数据在两个程序之间,在线等 registerwindowsmessage,然后广播通过sendmessage发消息,但怎么把他附加上去?请给出具体步骤 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 发送者:var SendText: string; SendDataStruct: CopyDataStruct;begin SendText := 'Send'; SendDataStruct.cbData := length(Sendtext); SendDataStruct.lpData := @SendText[1]; SendMessage(FindWindow(PCHAR('TForm1'), PCHAR('form1')), WM_CopyData, Application.Handle, lparam(@SendDataStruct));end;接收者: procedure DataIn(var DataMessage: TWMCopyData); message wm_copydata;procedure DataIn(var DataMessage: TWMCopyData); var ReceieveData : CopyDataStruct; temp: pchar; ReceieveStr : string;begin ReceieveData := DataMessage.CopyDataStruct^; temp := ReceieveData.lpdata; ReceieveStr := string(temp);end; 发送的:unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public procedure WndProc(var Message: TMessage); override; { Public declarations } end;const UserMessageStr = 'testmsg';var Form1: TForm1; UserWindowHandle : THandle = 0; UserMessage : UINT;implementation{$R *.DFM}{ TForm1 }procedure TForm1.WndProc(var Message: TMessage);begin if(Message.Msg = UserMessage) and (Message.wParam <> Handle) then begin // 客户发过来的消息 UserWindowHandle := Message.wParam; ReplyMessage(0); // 回应消息 , 因为SendMessage是一个阻塞函数,就是要等回应后才继续执行 end; inherited;end;procedure TForm1.Button1Click(Sender: TObject);var i : integer; ds: TCopyDataStruct; // WM_COPYDATA所需要的结构 str : string;begin if UserWindowHandle = 0 then begin SendMessage(HWND_BROADCAST,UserMessage,handle,0); // 进行广播 i:=1; while(i<=20) and (UserWindowHandle=0) do begin label3.caption := '正在连接用户程序,已试'+inttostr(i)+'次'; application.ProcessMessages; sleep(100); i := i+1; end; if UserWindowHandle=0 then //等待回应失败 begin Showmessage('连接用户程序失败'); exit; end; // 已经连接到用户程序 label3.caption := '连接用户程序成功!'; application.ProcessMessages; end; str := edit1.text; ds.cbData := Length (str) + 1; GetMem (ds.lpData, ds.cbData ); //为传递的数据区分配内存 StrCopy (ds.lpData, PChar (str)); SendMessage(UserWindowHandle,WM_COPYDATA,handle,Cardinal(@ds)); // 已经连接过,直接发消息 freemem(ds.lpdata); label3.caption := '已经发送!';end;procedure TForm1.FormCreate(Sender: TObject);begin UserMessage := RegisterWindowMessage(UserMessageStr); // 注册消息end;end. 接收:unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit; procedure FormCreate(Sender: TObject); private { Private declarations } public procedure WndProc(var Message: TMessage); override; procedure Mymessage(var t:TWmCopyData);message WM_COPYDATA; { Public declarations } end;const UserMessageStr = 'testmsg';var Form1: TForm1; UserWindowHandle : THandle = 0; UserMessage : UINT;implementation{$R *.DFM}{ TForm1 }procedure TForm1.WndProc(var Message: TMessage);begin if(Message.Msg = UserMessage) and (Message.wParam <> Handle) then begin // 对方发过来的消息 UserWindowHandle := Message.wParam; ReplyMessage(0); // 回应消息 SendMessage(UserWindowHandle, UserMessage, Handle, 1); end; inherited;end;procedure TForm1.FormCreate(Sender: TObject);begin UserMessage := RegisterWindowMessage(UserMessageStr); // 注册消息end;procedure TForm1.Mymessage(var t: TWmCopyData);var str : string;begin if t.From = UserWindowHandle then // 确认是从对方发过来的 begin str := strpas(t.CopyDataStruct^.lpData); ReplyMessage(1); Edit1.text := str; end;end;end. 如何在WebBrowser中判断默认网页是否打开(或存在),否则,打开指定的网页 系统中如何有效防止DeDe的反编译? 我有很多不错的源代码 ■■■强贴:移动就是比联通牛B.▲▲▲信不信由你.〓〓〓〓 请教如何判断一个文本文件的编码方式(ANSI,UNICODE,UTF-8等)? 这是什么意思? 怎么隐藏窗口? InstallShield具体该怎么用,谢了! 我用采集卡采集图像!一直在采,怎么才能保存我所需的图像! 关于写INI文件,遇到问题了,对于熟手来说简单! 连接ACCESS数据库的程序的路径问题 求助:Delphi中调用IRQ中断服务函数
var
SendText: string;
SendDataStruct: CopyDataStruct;
begin
SendText := 'Send';
SendDataStruct.cbData := length(Sendtext);
SendDataStruct.lpData := @SendText[1];
SendMessage(FindWindow(PCHAR('TForm1'), PCHAR('form1')), WM_CopyData, Application.Handle, lparam(@SendDataStruct));
end;接收者:
procedure DataIn(var DataMessage: TWMCopyData); message wm_copydata;procedure DataIn(var DataMessage: TWMCopyData);
var
ReceieveData : CopyDataStruct;
temp: pchar;
ReceieveStr : string;
begin
ReceieveData := DataMessage.CopyDataStruct^;
temp := ReceieveData.lpdata;
ReceieveStr := string(temp);
end;
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure WndProc(var Message: TMessage); override;
{ Public declarations }
end;const UserMessageStr = 'testmsg';
var
Form1: TForm1;
UserWindowHandle : THandle = 0;
UserMessage : UINT;
implementation{$R *.DFM}{ TForm1 }procedure TForm1.WndProc(var Message: TMessage);
begin
if(Message.Msg = UserMessage) and (Message.wParam <> Handle) then
begin // 客户发过来的消息
UserWindowHandle := Message.wParam;
ReplyMessage(0); // 回应消息 , 因为SendMessage是一个阻塞函数,就是要等回应后才继续执行
end;
inherited;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
ds: TCopyDataStruct; // WM_COPYDATA所需要的结构
str : string;
begin
if UserWindowHandle = 0 then
begin
SendMessage(HWND_BROADCAST,UserMessage,handle,0); // 进行广播
i:=1;
while(i<=20) and (UserWindowHandle=0) do
begin
label3.caption := '正在连接用户程序,已试'+inttostr(i)+'次';
application.ProcessMessages;
sleep(100);
i := i+1;
end;
if UserWindowHandle=0 then //等待回应失败
begin
Showmessage('连接用户程序失败');
exit;
end;
// 已经连接到用户程序
label3.caption := '连接用户程序成功!';
application.ProcessMessages;
end;
str := edit1.text;
ds.cbData := Length (str) + 1;
GetMem (ds.lpData, ds.cbData ); //为传递的数据区分配内存
StrCopy (ds.lpData, PChar (str));
SendMessage(UserWindowHandle,WM_COPYDATA,handle,Cardinal(@ds)); // 已经连接过,直接发消息
freemem(ds.lpdata);
label3.caption := '已经发送!';
end;procedure TForm1.FormCreate(Sender: TObject);
begin
UserMessage := RegisterWindowMessage(UserMessageStr); // 注册消息
end;end.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure WndProc(var Message: TMessage); override;
procedure Mymessage(var t:TWmCopyData);message WM_COPYDATA;
{ Public declarations }
end;const UserMessageStr = 'testmsg';
var
Form1: TForm1;
UserWindowHandle : THandle = 0;
UserMessage : UINT;implementation{$R *.DFM}{ TForm1 }procedure TForm1.WndProc(var Message: TMessage);
begin
if(Message.Msg = UserMessage) and (Message.wParam <> Handle) then
begin // 对方发过来的消息
UserWindowHandle := Message.wParam;
ReplyMessage(0); // 回应消息
SendMessage(UserWindowHandle, UserMessage, Handle, 1);
end;
inherited;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
UserMessage := RegisterWindowMessage(UserMessageStr); // 注册消息
end;procedure TForm1.Mymessage(var t: TWmCopyData);
var str : string;
begin
if t.From = UserWindowHandle then // 确认是从对方发过来的
begin
str := strpas(t.CopyDataStruct^.lpData);
ReplyMessage(1);
Edit1.text := str;
end;
end;end.