delphi 自定义消息

delphi 自定义消息

消息描述

Tmsg是 Windows系统用来记录描述一个具体的windows消息的。就是windows 用于封装应用程序及系统程序发生的消息,它是操作系统使用的。

Tmessage 则封装了TMsg的参数,是应用程序响应的消息。该消息记载了消息的编号,最重要的就是它携带的两个参数。一般接收对象要定义处理句柄,然后对收到的消息 进行处理。如果不定义处理句柄,就交给祖先类去处理。我们在应用程序中使用的是TMessage 消息,而不是TMsg消息。

消息结构

Windows消息结构---Tmsg:

typedef struct tagMSG {

HWND hwnd;

UINT message;

WPARAM wParam;

LPARAM lParam;

DWORD time;

POINT pt;

} MSG;

delphi消息结构---Tmesssage:

TMessage = packed record

Msg: Cardinal;

case Integer of

0: (

WParam: Longint;

LParam: Longint;

Result: Longint);

1: (

WParamLo: Word;

WParamHi: Word;

LParamLo: Word;

LParamHi: Word;

ResultLo: Word;

ResultHi: Word);

end;

其中Integer是个判断变量条件,0和1只是为了给变体字段分组,0部分的三个字段和1部分的六个字段共享一段 内存。这段内存大小是12个字节,你要么用WParam, LParam...来访问,要么用WparamLo,WParamHi来访问。用不到0和1这两个值的,他们仅仅为可读性而存在。

也可以用:

case Boolean of

False:(...);

True:(...);

我们知道一个32位整数在内存中是高字节在后,低字节在前,因此,WParamLo被对应到WParam的低16位,WParamHi被对应到WParam的高16位。依次类推。

实例:

当程序运行到 sendmessage(Form1.handle,WM_User+100,0,0)时,

操作系统就把这个消息进行描述,填入TMsg的一个结构中,大概是这样:

AMsg:TMsg;

AMsg.handle:=Form1.handle

AMsg.message:=WM_User+100

AMsg.WParam:=0

Amsg.lparam:=0;

Amsg.time:=Getsystemtime();

Amsg.pt:=mouse.CursorPos;

然后再把这个消息重新封装,提取它里面的参数,发送给Form1.handle 所在的消息队列,有

form1.handle 所在的wndproc过程进行处理。

形式如下:

msg:Tmessage;

Msg.msg:=Amsg.Message( WM_User+100)

Msg.lparam:=Amsg.lparam

msg.wparam;=Amsg.wparam

然后 put Msg to Form1 消息队列 ,由form1的窗体过程处理。

Delphi用户定义消息:

Delphi中用户定义的消息大小必须是128bit,也就是16字节。

Delphi在接受到Tmesssage后,会自动把该消息转换成用户定义的消息结构

实例:

procedure CMSocketMessage(var Message: TCMSocketMessage); message CM_SOCKETMESSAGE;

CM_SOCKETMESSAGE消息触发CMSocketMessage函数,

CM_SOCKETMESSAGE消息是Tmesssage结构。

TCMSocketMessage是用户自定义消息机构,结构如下:

TCMSocketMessage = record

Msg: Cardinal;

Socket: TSocket;

SelectEvent: Word;

SelectError: Word;

Result: Longint;

end;

delphi自动进行如下转换

TCMSocketMessage .Msg=Tmessage.Msg

TCMSocketMessage.Socket=Tmessage.WParam

TCMSocketMessage.SelectEvent=地位字段(Tmessage.Lparam);

TCMSocketMessage.SelectError=高位字段(Tmessage.Lparam);

TCMSocketMessage.Result =Tmessage.Result