在WINDOWS应用程序中,消息从产生到被处理的完整流程
2013-12-03 15:03
363 查看
主要内容:该篇文章主要描述在WINDOWS应用程序中,消息从产生到被处理的完整流程,此处以界面某一个控件被点击的整体流程为例,说明消息的流动及处理过程(此处消息属于输入消息)
1. 鼠标点击,产生单击事件,鼠标设备驱动程序根据用户事件,转换成消息,并放置于WINDOWS的系统队列中
2. WINDOWS将系统队列中的消息取出,并投掷于消息对应的应用程序所属的线程队列。
3. 每个应用程序在创建时,系统都会为其创建一个消息队列,发送给应用程序的消息都存放在该消息队列中,等待被处理。 而应用程序的消息引擎
会不停的从自己的专属消息队列中获取消息,并进行消息的翻译和转发(TranslateMessage和DiapatchMessage)
GetMessage:从线程队列中取消息,取出后对应的消息会从队列中删除;若无消息,则阻塞
TranslateMessage:
把键盘消息转换成对应的ASCII字符内存,并重新放置于队列中,等待取出
DispatchMessage:
在注册窗口对象时,有如下代码:及设置对口的消息处理回调函数
在窗口类的定义中,有如下代码:
该段代码,是的所有该类型的对话框对象共享一个消息MAP表,DispatchMessage会根据消息所属的窗口,调用回调函数WndProc,而WndProc则getMessageMap,根据消息类型,在map中进行匹配查找,找到对应的处理函数,并调用,则消息处理完毕。
鼠标点击事件产生至处理的完整流程图
问题:
1. 驱动程序如何捕捉事件,转换成消息并将其放置于系统队列中
2. 系统队列如何将消息投掷于其对应的线程队列中
3. 操作系统如何为应用程序线程创建消息队列,如何体现?
整体过程分析
1. 鼠标点击,产生单击事件,鼠标设备驱动程序根据用户事件,转换成消息,并放置于WINDOWS的系统队列中2. WINDOWS将系统队列中的消息取出,并投掷于消息对应的应用程序所属的线程队列。
3. 每个应用程序在创建时,系统都会为其创建一个消息队列,发送给应用程序的消息都存放在该消息队列中,等待被处理。 而应用程序的消息引擎
1 | MSG msg; |
2 |
3 | while (GetMessage(msg, NULL, NULL, NULL)) |
4 | { |
5 | TranslateMessage(&msg); |
6 | DispatchMessage(&msg); |
7 | } |
GetMessage:从线程队列中取消息,取出后对应的消息会从队列中删除;若无消息,则阻塞
TranslateMessage:
把键盘消息转换成对应的ASCII字符内存,并重新放置于队列中,等待取出
DispatchMessage:
在注册窗口对象时,有如下代码:及设置对口的消息处理回调函数
1 | WNDCLASS wc; |
2 | ...... |
3 | wc.lpfnWndProc = (WNDPROC)WndProc; |
4 | ...... |
1 | DECLARE_MESSAGE_MAP() |
2 | ...... |
3 | BEGIN_MESSAGE_MAP(CMsgTestDlg, CDialog) |
4 | ...... |
5 | ON_MESSAGE(WM_USER_SEND_MSG, &CMsgTestDlg::HandleSendMsg) |
6 | ON_MESSAGE(WM_USER_POST_MSG, &CMsgTestDlg::HandlePostMsg) |
7 | ...... |
8 | END_MESSAGE_MAP() |
鼠标点击事件产生至处理的完整流程图
问题:
1. 驱动程序如何捕捉事件,转换成消息并将其放置于系统队列中
2. 系统队列如何将消息投掷于其对应的线程队列中
3. 操作系统如何为应用程序线程创建消息队列,如何体现?
相关文章推荐
- Windows应用程序的消息处理机制
- C#开发WINDOWS应用程序时消息的处理
- 一个中断产生和处理的完整流程,以UD2指令产生的#UD中断为例。
- windows 鼠标消息触发及处理流程
- 异常信息:CLR无法从COM 上下文0x645e18 转换为COM上下文0x645f88,这种状态已持续60秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作.这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断累积
- C#开发 Windows 应用程序时消息的处理
- windows的开发流程--事件通知和消息处理
- Windows应用程序的消息处理机制
- Windows应用程序的消息处理机制
- 蔡军生先生第二人生的源码分析(三十七)消息处理的完整流程
- Windows应用程序的消息处理机制
- Windows应用程序消息处理机制
- Windows应用程序的消息处理机制
- C#开发WINDOWS应用程序时消息的处理
- C#开发WINDOWS应用程序时消息的处理
- 从消息处理角度看应用程序与windows的关系(图示)
- windows控制面板消息处理流程
- windows的窗口消息.处理流程本质.
- 第二人生的源码分析(三十七)消息处理的完整流程
- 第二人生的源码分析(三十七)消息处理的完整流程