张志峰的博客

水滴石川,积少成多。

导航

delphi 自定义消息

Posted on 2013-08-30 13:49  ╰★张志峰★╮  阅读(1081)  评论(0编辑  收藏  举报

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