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

原文地址:https://www.cnblogs.com/luckForever/p/7254613.html