如何利用Windows消息向另一个程序发送一个字符串 ( 积分: 30 )

  • 主题发起人 主题发起人 flyerer1
  • 开始时间 开始时间
把你自定义的数据用一个记录封装起来,然后动态把指向该记录的指针用消息发送过去,
wParam来封装你这个指针的,详见我给你写的:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
const
WM_MYTEST = WM_USER + $1000;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure WMMyTest(var Msg: TMessage);
message WM_MYTEST;
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
type
info = record
name: string;
code: string;
end;
pinfo = ^info;
{ TForm1 }
procedure TForm1.WMMyTest(var Msg: TMessage);
begin
ShowMessage((pinfo(msg.WParam).name));
dispose(pinfo(msg.WParam));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
ainfo: pinfo;
begin
new(ainfo);
ainfo.name:= 'lisongmagic';
ainfo.code:= '007';
PostMessage(Handle, WM_MYTEST, integer(ainfo), 0);
end;

end.
如果你的数据结构比较复杂,用我上面的记录不好封装,那就建立一个类来封装你的
数据,然后照我上面的方法,把该类的对象传过去,就像我上面的传记录指针一样的
方法
 
发送过去,数据如何接收呢?
 
我的例子可以运行,你试一下,然后就知道了
 
双进程肯定不能直接发送指针,除非附加到内存印象文件上才可以
 
TO: lisongmagic
如同datm所说,你这样使用自定义消息是不能在进程间发送的。
要用消息发的话,可以使用 WM_COPYDATA 这个消息 在进程间发
 
WM_COPYDATA?
能给详细code吗?
 
楼上正确,WM_COPYDATA
 
wm_copydata 可以.. 你可以看 msdn 帮助就可以了
----------------------------------------------
简单方法
目标程序中定义一个目标窗口
发送程序 findwindow 找到目标窗口, sendmessage(handle, wm_settext...
然后目标程序 去读目标窗口的caption 即可
--------------------------------------------
利用 内存映射文件也可以, 有点复杂了
 
发送部分
TCopyDataStruc = packed record
dwData: DWord;
cbData: DWord;
lpData: Pointer;
end;
PCopyDataStruc = ^TCopyDataStruc ;
procedure SendMessageTo(hwdSend: HWND;
S: String);
//hwdSend是目标进程,S是要发的内容
const
Msg=$1357;
//自定义值 用于判断是否自己发的消息
var
BufferData: TCopyDataStruc;
Buf: PChar;
BufSize: Integer;
begin
BufSize := Length(S);
Buf := AllocMem(BufSize+1);
StrCopy(Buf, PChar(S));
Try
with BufferDatado
begin
dwData := Msg;
cbData := BufSize;
lpData := Buf;
end;
SendMessage(hwdSend, WM_COPYDATA, 0, LongInt(@BufferData));
finally
FreeMem(Buf, BufSize+1);
end;
end;

//接收部分
procedure WMCopyData(var M: TMessage);
Message WM_COPYDATA;

procedure WMCopyData(var M: TMessage);
const
Msg= $1357;
var
PStr: PChar;
AText: String;
iSize, i: Integer;
Buf: Array [0..255] of Char;
begin
if PCopyDataStruc(M.LParam)^.dwData = Msg then
begin
iSize := PCopyDataStruc(M.LParam)^.cbData;
PStr := PChar(PCopyDataStruc(M.LParam)^.lpData);
StrLCopy(Buf, PStr, iSize);
AText := String(Buf);
//AText里面就是发过来的内容
end;
end;
 
themars 回答的非常棒
 
多人接受答案了。
 
可我的另一个程序还是没有接收到数据啊.
能发个源码项目文件吗?
 
后退
顶部