DELPHI下的WINDOWS消息传递机制

原创 2006年06月15日 19:55:00

BLOG开了很久,专业的东西一点没写,今天既然已经坐下了,就写点东西吧,也算调整调整心绪!

    开发基于WINDOWS平台的应用程序时,了解WINDOWS消息系统组成是非常必要的。

    消息本身是作为一个记录传递给应用程序的,记录中包含消息的类型以及其它的信息!这个记录类型叫做TMsg,它在WINDOWS单元中声明,这里就不一一列举(偶打字很辛苦的:P)

    在WIN32中预定义的一些消息常量往往是以WM开头,以代表某一特定的消息。DELPHI的MESSAGE单元中定义了所有WINDOWS消息,如果有兴趣可以自己打开MESSAGE单元研究一下!

    WINDOWS的消息系统由3部分组成:(1)消息队列,WINDOWS能够为所有的应用程序维护一个消息队列,应用程序必须从消息队列中获取消息,然后分派给某个窗口。(2)消息循环,通过这个循环机制,应用程序从消息队列中检索消息,再把它分派给适当的窗口,依次进行。(3)窗口过程,每个窗口都有一个窗口过程,以接收WINDOWS传递给窗口的消息,窗口过程的任务就是要获取消息并响应它(窗口过程是一个回调函数,处理完一个消息后,通常要给WINDOWS一个返回值)。

    从消息的产生到消息被一个窗口响应,这其中要经历以下几个步骤:(1)系统中发生了某个事件。(2)WINDOWS把这个事件翻译成消息,然后把它放在消息队列中。(3)应用程序从消息队列中接收这个消息,并把它存放在TMsg记录中。(4)应用程序把消息传递给一个适当的窗口过程。(5)窗口过程响应这个消息并进行处理。

    下面说说DELPHI的VCL消息系统处理原理:

    DELPHI中的每一个VCL组件都有内在的消息处理机制,在建立一个窗体或加入一个组件时,VCL就已经注册了一个消息接收例程MainWndProc,这个例程是每个窗体和组件固有的。MainWndProc是定义在TWinControl类中的一个静态方法,不能被重载。它不直接处理消息,而是交给WndProc处理并提供异常保护。如有异常发生,则调用Application.HandleException方法处理异常。具体可以自己查看TWinControl类MainWndProc的实现代码,偶这里就不贴了!

    WndProc是TControl类中的一个虚拟方法,这意味着它可以被覆盖,提供自定义的消息处理例程(事实上,TControl构件中就是利用它来过滤并处理所有的鼠标消息(从WM_MOUSEFIRST到WM_MOUSELAST)的)。WndProc调用DisPatch方法进行消息分配,具体代码可以查看TControl类WndProc的代码实现。

    DisPatch方法是在TObject根类中定义的,传递给它的参数必须是一个记录类型,这个记录中的第一个点必须是个Cardinal类型的字段。DisPatch方法根据消息号码调用组件的最后继承类中处理此消息的句柄方法。如果此组件和它的祖先类中都没有对应此消息的处理句柄,DisPatch方法便会调用DefaultHandler方法,DisPatch方法是定义于TObject类中的虚拟方法,它只是简单的返回而不对消息做任何处理。我们可以对此虚拟方法的重载,在子类中实现对消息的缺省处理(OH……MY GOD,怎么掉线了~~)。

    这就是DELPHI对WINDOWS消息的处理流程!

    发送消息:

    DELPHI主要通过三种方式发送消息。Perform(),使用于所有的TControl派生对象。SendMessage()和PostMessage()。这些想必都比较熟悉,不再多说了!如果需要跨进程发送消息,就要用到RegisterWindowMessage(),它能够确保每个应用程序使用一致的消息序号。具体使用方法可以参考帮助,很简单的!TWinControl派生的对象可以调用Broadcast()向它的子组件广播一个消息。当需要向一组组件发送相同的消息时,便可以使用这种技术!如果要用SendMessage()或PostMessage()实现广播消息,只需要把第一个参数——目标对象句柄——设置为HWND_BROADCAST就可以,它代表向所有应用的主窗口发送消息!

    消息过滤:DELPHI消息过滤一般有3种方法,重载构件继承的虚方法WndProc;针对某消息编写消息处理句柄;重载构件继承的虚方法DefaultHandler。其中第二中方法比较常用!

Windows消息传递机制详解

Windows是一个消息(Message)驱动系统。Windows的消息提供了应用程序之间、应用程序与Windows系统之间进行通信的手段。应用程序想要实现的功能由消息来触发,并且靠对消息的响应和处理...

Windows消息传递机制

这里有几个关键词:消息,消息循环,窗口过程。   所谓的Windows消息传递机制就类似于生活中的物流公司。当寄件人(例如鼠标、键盘)将包裹(消息)交给物流公司(Windows系统)时,物流公司(...
  • s1915
  • s1915
  • 2015年01月06日 18:39
  • 327

Ogre消息传递机制

  • 2008年01月03日 15:16
  • 248KB
  • 下载

VC消息传递机制

  • 2017年05月02日 15:49
  • 49KB
  • 下载

windows 消息机制、窗口过程与线程间消息传递

按照自己的理解好好整理一遍 消息机制 windows是一个消息驱动的系统,会有一个总的系统消息的队列,鼠标、键盘等等都会流入到这个队列中,同时会为每个线程维护一个消息队列(注意默认是有GU...
  • leonwei
  • leonwei
  • 2013年02月18日 16:38
  • 5268

MTK定时器消息传递机制

  • 2010年05月23日 16:36
  • 86KB
  • 下载

MFC的消息传递机制仿真

  • 2017年06月24日 20:27
  • 13.05MB
  • 下载

Android 源码解析Handler消息传递机制

Android 源码解析Handler消息传递机制, android中可以使用Handler机制进行跨线程消息传递。本文将站在源码的角度详细分析handler的消息传递机制。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DELPHI下的WINDOWS消息传递机制
举报原因:
原因补充:

(最多只允许输入30个字)