如何向其他应用程序发送自定义消息?

forestwwq 2002-12-05 02:17:51
我想向其他应用程序发送自定义的windows消息,在消息中传送字符串,我把字符串作为lparam传送给其他程序,但其他程序接收到是乱码?怎么办?
...全文
193 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
uncarman 2002-12-09
  • 打赏
  • 举报
回复
同上
stanely 2002-12-09
  • 打赏
  • 举报
回复
字符串不会丢失数据。
因为不是pchar.

string遇到#0不会当作结束。
forestwwq 2002-12-09
  • 打赏
  • 举报
回复
在function GetCopyData(AMsg:TWMCopyData):string;中,我认为最好不要使用字符串复制,有可能丢失数据,应该使用copyMemory从消息中得到数据。
stanely 2002-12-05
  • 打赏
  • 举报
回复
//使用起来很简单:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure hand(var msg:twmcopydata);message wm_copydata;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
uses
copydata_san;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
sendcopydata(handle,'sss');//这个handle可以是任何窗口的句柄,可以用findwindow得到其他进程的窗口句柄。
end;

procedure TForm1.hand(var msg: twmcopydata);
begin
showmessage(getcopydata(msg));
end;

end.
///////////////
发送的数据量应该是4G以内的,没做过很详尽的测试,你还要看看ms的资料
stanely 2002-12-05
  • 打赏
  • 举报
回复
//给你个单元,提供wm_copydata的操作:
unit CopyData_San;

interface
uses
windows,messages,sysutils;

///////////////////////
function GetCopyData(AMsg:TWMCopyData):string;overload;
procedure GetCopyData(AMsg:TWMCopyData;var P:pointer;var len:integer);overload;
///////////////////////////
function SendCopyData(AHandle:Cardinal;AStr:string;wParam:integer=0;dwData:cardinal=0):integer;overload;
function SendCopyData(AHandle:Cardinal;P:pointer;Len:integer;wParam:integer=0;dwData:cardinal=0):integer;overload;

implementation
function SetData(p:pointer;len:integer;dwData:cardinal):TCopyDataStruct;
begin
result.cbData:=len;
result.lpData:=p;
result.dwData:=dwData;
end;
function SendCopyData(AHandle:Cardinal;AStr:string;wParam:integer=0;dwData:cardinal=0):integer;overload;
var
len:integer;
begin

len:=length(astr);
if len<=0 then exit;

result:=sendcopydata(ahandle,@astr[1],len,wparam,dwdata);

end;

function SendCopyData(AHandle:Cardinal;P:pointer;Len:integer;wParam:integer=0;dwData:cardinal=0):integer;overload;
var
cs:tcopydatastruct;
begin
cs:=setdata(p,len,dwdata);
result:=sendmessage(ahandle,wm_copydata,wparam,Cardinal(@cs));

end;
procedure GetCopyData(AMsg:TWMCopyData;var P:pointer;var len:integer);
begin
p:=amsg.CopyDataStruct.lpData;
len:=amsg.CopyDataStruct.cbData;
end;
function GetCopyData(AMsg:TWMCopyData):string;
var
i,len:integer;
type
pstr=array of char;
begin
result:='';
len:=amsg.CopyDataStruct.cbData;
if len<=0 then exit;
setlength(result,len);
for i:=1 to len do
begin
result[i]:=pstr(amsg.CopyDataStruct.lpData)[i-1];
end;
end;



end.
jianzhang 2002-12-05
  • 打赏
  • 举报
回复
利用 WM_COPYDATA消息
 

使用该消息涉及一个 TcopyDataStruct结构类型的指针。该结构中有三个成员:

dwData 是一个 32位的附加参数

cbData 表示要传递的数据区的大小

lpData 表示要传递的数据区的指针

下面举个例子。该例子由两个程序构成,分别为 SendData和 GetData。

SendData程序向 GetData程序发送消息,并传递 edit1中的字符串; GetData在收到消息后,把 SendData发送的字符串接受下来,并显示在相应的 edit1中。

SendData程序:
……

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

var

ds: TCopyDataStruct;

hd: THandle;

begin

ds.cbData := Length (Edit1.Text) + 1;

GetMem (ds.lpData, ds.cbData ); //为传递的数据区分配内存

StrCopy (ds.lpData, PChar (Edit1.Text));

Hd := FindWindow (nil, 'Form2'); // 获得接受窗口的句柄

if Hd <> 0 then

SendMessage (Hd, WM_COPYDATA, Handle,

Cardinal(@ds)) // 发送 WM_COPYDATA消息

else

ShowMessage ('目标窗口没找到! ');

FreeMem (ds.lpData); //释放资源

end;

GetData程序:
 

TForm2 = class(TForm)

Edit1: TEdit;

private

{ Private declarations }

public

procedure Mymessage(var t:TWmCopyData);message WM_COPYDATA;

{ Public declarations }

end;

var

Form2: TForm2;

implementation

procedure TForm2.Mymessage(var t:TWmCopyData);

begin

Edit1.text:=StrPas(t.CopyDataStruct^.lpData);//接受数据并显示。

end;


forestwwq 2002-12-05
  • 打赏
  • 举报
回复
能描述的清楚一点吗?如果有示例就更好了。
智商无下限 2002-12-05
  • 打赏
  • 举报
回复
copydata

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧