首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

windows消息处理过程的有关问题

2012-03-28 
windows消息处理过程的问题你好:我想弄明白windows消息处理过程,在系统内部做了些什么?比如说,一个界面上,

windows消息处理过程的问题
你好:
我想弄明白windows消息处理过程,在系统内部做了些什么?
比如说,一个界面上,有3个button。当用户点击了鼠标左键后,会产生一个鼠标左击的消息事件,然后这个消息被系统接受后,是不是放入消息队列中,然后把这个消息在分发出去(::GetMessage,::PeekMessage)(::DispatchMessage)。
这个消息产生过程中,系统怎么判断这个消息是在button1 button2 button3 form中哪个控件上发生的。也就是怎么去判断窗口句柄的。消息结构(MSG)中的hwnd是怎么产生的?多谢

[解决办法]
MFC界面中有一个线程专门负责界面消息的处理
窗口可以接收消息和发送消息,并对消息作出响应
鼠标点击的时候,窗口发送消息,自然会包含窗口的hwnd
typedef struct tagMSG { 
HWND hwnd; 
UINT message; 
WPARAM wParam; 
LPARAM lParam; 
DWORD time; 
POINT pt; 
} MSG; 
在一个窗口中,每个控件的ID值唯一,也就构成了message的值
在MFC进行消息分发时会查询消息映射表,将消息发送到指定的hwnd和message的线程

[解决办法]
鼠标点击后就会产生一个MSG,其中hwnd将要处理这个消息的窗口句柄,如果这个消息没有进消息队列则直接发送到(处理该消息的)窗口,进队列则DispatchMessage到指定的窗口(消息MSG中hWnd)标识的那个
[解决办法]
http://blog.csdn.net/qaz19870418/article/details/6038276
[解决办法]
问题1: 系统怎么知道鼠标点在哪个窗口上?

你要明白,窗口是系统画出来的:基本方法是,系统计算屏幕的表面是由哪些窗口暴露的哪些部分拼接而成的,把这些部分交由窗口分别去paint,系统然后将各线程交回的DC拼合在一起,形成一帧图像,显示在屏幕上。所以,系统很明白的知道当下显示的图像的具体的哪个区域属于哪个HWND。


问题2: 系统如何传递消息?

系统大体有两类消息:入列消息和不入列消息。入列消息进入消息队列,可以由GetMessage或PeekMessage函数取出,不入列消息自然不可从线程消息队列取出。PostMessage产生入列消息,SendMessage产生不入列消息。入列消息比较容易理解,无非是个生产-消费的简单模型。


问题3: 不入列消息谁来处理、如何处理?

不入列消息是在SendMessage或GetMessage函数内处理的。当线程1调用SendMessage向HWND A 发消息,SendMessage函数内部先判断HWND A是否属于线程1,如果属于,则直接DispatchMessage(分派+处理),如果不属于,则从全局字典找到HWND A的线程2的HOST对象,并将自己的HOST挂入线程2的“不入列消息的处理表”中。此刻线程1相当于阻塞住了,当线程2调用GetMessage函数,首先判断不入列消息处理表中是否有记录,便会发现线程1注册的那个消息,则线程2立刻处理这个消息(DispatchMessage),然后通知线程1,令其停止阻塞,继续运行。




热点排行