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

delphi 自定义消息的更多相关文章

  1. Delphi自定义消息应用及delphi托盘实现

    Delphi自定义消息应用及delphi托盘实现interfaceuses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Co ...

  2. 深入delphi编程理解之消息(二)发送消息函数及消息编号、消息结构体的理解

    一.delphi发送消息的函数主要有以下三个: (一).SendMessage函数,其原型如下: function SendMessage( hWnd: HWND; {目标句柄} Msg: UINT; ...

  3. Delphi 使用自定义消息

    Delphi 使用自定义消息   1.先用Const 定义一个常量,例如 const WM_MyMessage=WM_USER+$200; 2.在要实现的unit中定义一个私有方法 procedure ...

  4. DELPHI中自定义消息的发送和接收

    DELPHI中的消息处理机制 Delphi是Borland公司提供的一种全新的WINDOWS编程开发工具.由于它采用了具有弹性的和可重用的面向对象Pascal(object-orientedpasca ...

  5. 利用消息机制实现VC与Delphi之间的通讯(发送自定义消息)

    摘要: 本文介绍了使用Windows消息机制实现由不同语言编制的程序之间的相互通讯.联系,并以当前较为流行的两种语言Microsoft Visual C++ 6.0和Borland delphi 5. ...

  6. Delphi Berlin 10.1.2 FMX用TMessageManager处理自定义消息

    看FMX代码,发现有两种消息处理的实现方式,一种是用TMessageManager来实现自定义的消息,另外一种象TEdit中的实现,直接声明消息方法.   早前,看过文章说TMessageManage ...

  7. Delphi 关键字详解[整理于 "橙子" 的帖子]

    absolute //它使得你能够创建一个新变量, 并且该变量的起始地址与另一个变量相同. var   Str: ];   StrLen: Byte absolute Str; //这个声明指定了变量 ...

  8. Delphi常用关键字用法详解

    本文详细介绍了Delphi中常用的各个关键字名称及用法,供大家在编程过程中借鉴参考之用.详情如下: absolute: ? 1 2 3 4 5 6 7 8 9 10 //它使得你能够创建一个新变量, ...

  9. delphi如何让程序最小化到任务栏(转)

    现在很多的应用程序都有这样一种功能,当用户选择最小化窗口时,窗口不是象平常那样最小化到任务栏上,而是“最小化”成一个任务栏图标.象FoxMail 3.0 NetVampire 3.0等都提供了这样的功 ...

随机推荐

  1. python字符串replace()方法

    python字符串replace()方法 >>> help(str.replace)Help on method_descriptor:replace(...)    S.repla ...

  2. PHP微信公众号 access_token缓存

    PHP创建access_token.json文件,将access_token 和 生成时间expires 保存在其中, {"access_token":"xxxx&quo ...

  3. oracle死锁模拟

    环境介绍: 用户test01 创建表tab01,用户test02创建表tab02.Test01 更新tab01不提交,test02 更新表tab02不提交.然后test01 更新test02下的表ta ...

  4. iOS开发知识点:理解assign,copy,retain变strong

    一..h和.m文件的变化说明 1.对于.h头文件,主要是将属性定义由retain变为strong @property (retain, nonatomic) 变为 @property (strong, ...

  5. 安卓自写Adapter

    代码: package com.example.ouradapter; import android.app.ListActivity; import android.content.Context; ...

  6. DontDestroyOnLoad

    本文由博主(YinaPan)原创,转载请注明出处:http://www.cnblogs.com/YinaPan/p/Unity_DontDestroyOnLoad.html  public stati ...

  7. 高级I/O函数(3)-tee、fcntl函数

    tee函数使用 功能描述:tee函数在两个管道文件描述符之间复制数据,也是零拷贝操作.它不消耗数据,因此源文件描述符仍然可以用于后续的操作. 函数原型: #include <fcntl.h> ...

  8. 【USACO 3.1.1】最短网络

    [描述]      农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的场.当然,他需要你的帮助.     约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共 ...

  9. vim插件和配置

    vim插件和配置 插件 pathogen 可以方便地管理vim插件 在没有pathogen的情况下,vim插件的文件全部都放在.vim目录,卸载插件很麻烦,pathogen可以将不同的插件放在一个单独 ...

  10. wamp环境网站根目录更改

    1.修改wampserver的默认目录 安装好wampserver后,网站根目录默认为:安装目录\wamp\www,也就是wampserver安装目录下的www文件夹. 我们以更改为:D\www为例. ...