自定义消息中如何传递字符串参数?(100分)

  • 主题发起人 主题发起人 LeeChange
  • 开始时间 开始时间
L

LeeChange

Unregistered / Unconfirmed
GUEST, unregistred user!
用SendMessage(aHandle, WM_SetText, 0, LParam(LPCSTR(s));能够正常传出字符串,
但用自定义消息时却始终无法正确接收.
 
接收信息你是如何写的? 接收时只要转换一下格式即可!
而且个人觉得发送自定义信息应该用如下格式:
SendMessage(aHandle, WM_SetText, LParam(LPCSTR(s), 0);
 
你所讲的问题应是两个应用程序间传递数据的问题,
A程序不能直接将地址传给B程序,让B程序按该地址访问数据
 
用内存映射文件存放数据, 用消息通知吧.
 
如果真是两个进程间无法互相访问地址,那么WM_SetText是怎样实现传送字符的
 
应该使用WM_COPYDATA传递字符串,和WM_SetText一样,传递过程里面Windows做了进程间的地址转换
 

TFormInfor = packed record
FormCaption: string;
FormHandle: HWND;
end;
PFormInfor = ^TFormInfor;

TWM_HGMDICombo = packed record
Msg: Cardinal;
NoUsed: Longint;
FormInfor: PFormInfor;
Result: Longint;
end;
象上面那样,先定义好消息的结构,通过指针去访问
 
借花献佛
最简单莫过来消息了。
type
PData = ^TData;
TData = record
size: Integer;
buffer: pchar;
end;

var
Data: TData;
begin
Data.Size := Size;
Data.Buffer := Buffer;
postThreadMessage(Thread1.ThreadID, WM_ThreadData, Integer(@Ddata));
end;

thread2;
var
Data: TData;
begin
while GetMessage(msg, 0, 0, 0) do
if msg.msg = WM_ThreadData then
begin
Data := PData(msg.LParam)^;
//proc data
end;
end;
 
下面是自定义消息的处理,你看了就会明白:

要传送的参数最好放在全局变量中,因为局部变量马上会消失。

unit Unit1;

interface

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

const
WM_MYTEST=WM_USER+1;

type

TUser=record
UserName:string;
UserID:word;
UserDateTime:TDateTime;
end;
PUser=^tUser ;

TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure WMTEST(var Message:TMessage);message WM_MYTEST;
public
{ Public declarations }
end;

var
Form1: TForm1;
User:TUser;
implementation

{$R *.DFM}

procedure TForm1.WMTEST(var Message:TMessage);
var
p:PUser;
begin
p:=PUser(message.wparam);
label1.caption:=format('%s %d %s',[p^.UserName,p^.UserId,datetimetostr(p^.Userdatetime)]);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
User.UserName:='王建欣';
User.UserID:=4825;
User.UserDateTime:=Now;
SendMessage(Form1.Handle,WM_MYTEST,Integer(@User),0);
end;

end.
 
接受答案了.
 
后退
顶部