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. Qt 学习之路:视图选择 (QItemSelectionModel)

    选择是视图中常用的一个操作.在列表.树或者表格中,通过鼠标点击可以选中某一项,被选中项会变成高亮或者反色.在 Qt 中,选择也是使用了一种模型.在 model/view 架构中,这种选择模型提供了一种 ...

  2. Java 日志缓存机制的实现--转载

    概述 日志技术为产品的质量和服务提供了重要的支撑.JDK 在 1.4 版本以后加入了日志机制,为 Java 开发人员提供了便利.但这种日志机制是基于静态日志级别的,也就是在程序运行前就需设定下来要打印 ...

  3. jsp页面禁用缓存

    问题:为什么禁用JSP页面缓存 就是为了得到实时信息 怎样禁用JSP页面缓存 1.在JSP页面设置 <meta http-equiv="pragma" content=&qu ...

  4. Android(java)学习笔记222:开发一个多界面的应用程序之不同界面间互相传递数据(短信助手案例的优化:请求码和结果码)

    1.开启界面获取返回值 (1)采用一种特殊的方式开启Activity:               startActivityForResult(intent , 0): (2)在被开启的Activi ...

  5. uva 1146 Now or late (暴力2-SAT)

    /* 裸地2-SAT问题 关键是模型转化 最小的最大 显然二分 关键是Judge的时候怎么判断 每个航班是早是晚直接影响判断 早晚只能选一个 如果我们定义bool变量xi表示 i航班是否早到 每个航班 ...

  6. Request 获取Url

    1.获取页面,HttpContext.Current.Request也是Request //获取当前页面url string myurl = HttpContext.Current.Request.U ...

  7. Js数学函数1

    1.取模求余数 //1.JS取模求余 //输出 for (var i = 0; i < 20; i++) { if (i % 3 == 0) { documentHelper.WriteText ...

  8. .Net操作XML文件

    //设置配置文件物理路径 public string xmlPath = "/manage/spider/config.xml"; protected void Page_Load ...

  9. for update和for update nowait的区别和使用

    首先,for update 和for update nowait 是对操作的数据行进行加锁,在事务提交前防止其他操作对数据的修改. for update 和for update nowait主要区别在 ...

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

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