DELPHI下的WINDOWS消息传递机制

本文深入讲解了Windows消息系统的组成及工作原理,包括消息队列、消息循环和窗口过程等核心概念,并详细阐述了Delphi VCL消息处理机制,以及如何在Delphi中发送和过滤消息。

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。其中第二中方法比较常用!

Creating Windows CreateMDIWindow CreateWindow CreateWindowEx RegisterClass RegisterClassEx UnregisterClass Message Processing BroadcastSystemMessage CallNextHookEx CallWindowProc DefFrameProc DefMDIChildProc DefWindowProc DispatchMessage GetMessage GetMessageExtraInfo GetMessagePos GetMessageTime GetQueueStatus InSendMessage PeekMessage PostMessage PostQuitMessage PostThreadMessage RegisterWindowMessage ReplyMessage SendMessage SendMessageCallback SendMessageTimeout SendNotifyMessage SetMessageExtraInfo SetWindowsHookEx TranslateMessage UnhookWindowsHookEx WaitMessage Window Information AnyPopup ChildWindowFromPoint ChildWindowFromPointEx EnableWindow EnumChildWindows EnumPropsEx EnumThreadWindows EnumWindows FindWindow FindWindowEx GetClassInfoEx GetClassLong GetClassName GetClientRect GetDesktopWindow GetFocus GetForegroundWindow GetNextWindow GetParent GetProp GetTopWindow GetWindow GetWindowLong GetWindowRect GetWindowText GetWindowTextLength IsChild IsIconic IsWindow IsWindowEnabled IsWindowUnicode IsWindowVisible IsZoomed RemoveProp SetActiveWindow SetClassLong SetFocus SetForegroundWindow SetParent SetProp SetWindowLong SetWindowText WindowFromPoint Processes and Threads CreateEvent CreateMutex CreateProcess CreateSemaphore CreateThread DeleteCriticalSection DuplicateHandle EnterCriticalSection ExitProcess ExitThread GetCurrentProcess GetCurrentProcessId GetCurrentThread GetCurrentThreadId GetExitCodeProcess GetExitCodeThread GetPriorityClass GetThreadPriority GetWindowThreadProcessId InitializeCriticalSection InterlockedDecrement InterlockedExchange InterlockedIncrement LeaveCriticalSection OpenEvent OpenMutex OpenProcess OpenSemaphore PulseEvent ReleaseMutex ReleaseSemaphore ResetEvent ResumeThread SetEvent SetPr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值