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 学习之路 :访问网络(4)

    前面几章我们了解了如何使用QNetworkAccessManager 访问网络.在此基础上,我们已经实现了一个简单的查看天气的程序.在这个程序中,我们使用QNetworkAccessManager进行 ...

  2. navigaitonBar的自定义设置

    navigaitonBar的自定义设置 navigationBar介绍: navigationbar就是一个导航视图控制器上面的导航栏. 如何设置这个navigationbar? 首先我们来探讨如何来 ...

  3. 汉诺塔III 递推题

    题目描述: 约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下.由小到大顺序串着由64个圆盘构成的塔.目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动 ...

  4. iOS应用内支付(内购)的个人开发过程及坑!

    本文会给大家详细介绍iOS内购,这是本人16年5月底的开发过程,希望对看完此篇文章的人有所帮助. 本文基于XcodeVersion 7.3 (7D175)版本,手机是iPhone 6,9.3系统. 部 ...

  5. 刨根问底:对于 self = [super init] 的思考

    对象初始化有两种方式:[class new] 与 [[class alloc] init] 对于后者,有分配和初始化的过程,alloc 从应用程序的虚拟地址空间上为该对象分配足够的内存,并且将新对象的 ...

  6. 给iOS开发者的GCD用户手册

    Grand Central Dispatch,或者GCD,是一个极其强大的工具.它给你一些底层的组件,像队列和信号量,让你可以通过一些有趣的方式来获得有用的多线程效果.可惜的是,这个基于C的API是一 ...

  7. C#解leetcode 53.Maximum Subarray

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  8. asp.net错误日志写入

    当我们一个web项目开发已完成,测试也通过了后,就把他放到网上去,但是,bug是测不完的,特别是在一个大的网络环境下.那么,我们就应该记录这些错误,然后改正.这里,我的出错管理页面是在global.a ...

  9. python中的generator, iterator, iterabel

    先来看看如果遇到一个对象,如何判断其是否是这三种类型: from types import GeneratorType from collectiuons import Iterable, Itera ...

  10. (一)SAPI简述

    SAPI,软件中的语音技术包括两方面的内容,一个是语音识别(speech recognition) 和语音合成(speech synthesis).这两个技术都需要语音引擎的支持. 下面我们来了解下基 ...