问了好几天的sendmessage了。
现在换个角度问。
就是我想用sendmessage发消息,第二个参数是自定义的。我想在第四个参数传字符串。怎么传啊?
Delphi的sendmessag是已经声明好的了。
如果我自己声明一个
function SendMessageZ(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: PChar): LRESULT; stdcall;
第四个参数是pchar或string型的行吗?
我试过了,我弄了半天,接收方都得到错误信息。如何能得到正确的呢?
现在换个角度问。
就是我想用sendmessage发消息,第二个参数是自定义的。我想在第四个参数传字符串。怎么传啊?
Delphi的sendmessag是已经声明好的了。
如果我自己声明一个
function SendMessageZ(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: PChar): LRESULT; stdcall;
第四个参数是pchar或string型的行吗?
我试过了,我弄了半天,接收方都得到错误信息。如何能得到正确的呢?
unit Unit13737;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
procedure WMCOPYDATA(var Msg: TWMCopyData); message WM_COPYDATA;
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.WMCOPYDATA(var Msg: TWMCopyData);
begin
ShowMessage(StrPas(Msg.CopyDataStruct.lpData));
end;procedure TForm1.Button1Click(Sender: TObject);
var
cds: TCOPYDATASTRUCT;
S:string;
begin
S:='test';
cds.dwData := 1;
cds.cbData := Length(S) + 1;
cds.lpData := nil;
GetMem(cds.lpData, cds.cbData); //为传递的数据区分配内存
try
if cds.lpData <> nil then
begin
try
StrCopy(cds.lpData, PChar(S));
Windows.SendMessage(Self.Handle, WM_COPYDATA, 0, Integer(@cds));
except
end;
end;
finally
if cds.lpData <> nil then
begin
FreeMem(cds.lpData); //释放资源end;
end;
end;
end;end.
如果不用COPYDATASTRUCT的话,不会运行WM_COPYDATA消息标识的函数的。
我试过了。至于为啥?我还要慢慢研究下WM_COPYDATA
MYTEST=WM_USER+1002;
...... procedure OnMyTest(var message:Tmessage); message MYTEST;......procedure TForm1.Button1Click(Sender: TObject);
var
test:string;
begin
test:='你看到了吧';
sendmessage(handle,MYTest,0,Integer(@test)); //发送消息 取test的指针位置
end;procedure TForm1.OnMyTest(var message: Tmessage);
begin
showmessage(string(Pointer(message.LParam)^)); //利用指针重新找到字符串
end;~~~~~~~~~~~~~~~~
用pchar也也一样,更好理解!
str :string;
end;
PTemp = ^TTemp;
var
p :PTemp;
begin
new(p);
sendmessage(hwnd,消息,wparam,Integer(p));
end;接收:
var
p :PTemp;
begin
p := PTemp(lparam);
if p<>nil then
begin
...
...
Dispose(p);
end;
end;