在WINDOWS应用程序中,消息从产生到被处理的完整流程

转载 2013年12月03日 15:03:11

主要内容:该篇文章主要描述在WINDOWS应用程序中,消息从产生到被处理的完整流程,此处以界面某一个控件被点击的整体流程为例,说明消息的流动及处理过程(此处消息属于输入消息)

整体过程分析

1. 鼠标点击,产生单击事件,鼠标设备驱动程序根据用户事件,转换成消息,并放置于WINDOWS的系统队列中

2. WINDOWS将系统队列中的消息取出,并投掷于消息对应的应用程序所属的线程队列。

3. 每个应用程序在创建时,系统都会为其创建一个消息队列,发送给应用程序的消息都存放在该消息队列中,等待被处理。 而应用程序的消息引擎

1 MSG msg;
2  
3 while(GetMessage(msg, NULL, NULL, NULL))
4 {
5       TranslateMessage(&msg);
6       DispatchMessage(&msg);
7 }

会不停的从自己的专属消息队列中获取消息,并进行消息的翻译和转发(TranslateMessage和DiapatchMessage)

 

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()

该段代码,是的所有该类型的对话框对象共享一个消息MAP表,DispatchMessage会根据消息所属的窗口,调用回调函数WndProc,而WndProc则getMessageMap,根据消息类型,在map中进行匹配查找,找到对应的处理函数,并调用,则消息处理完毕。

 

 鼠标点击事件产生至处理的完整流程图

问题:

1. 驱动程序如何捕捉事件,转换成消息并将其放置于系统队列中

2. 系统队列如何将消息投掷于其对应的线程队列中

3. 操作系统如何为应用程序线程创建消息队列,如何体现?

相关文章推荐

Windows应用程序的消息处理机制

Windows应用程序的消息处理机制:1)操作系统接收应用程序窗口信息,将消息传递到应用程序的消息队列中; 2)应用程序在消息循环中,调用GetMessage函数,将消息从队列中一条一条取出来,并进...

IOS应用程序发布到苹果APP STORE完整流程使用教程

参考: http://blog.csdn.net/mad1989/article/details/8167529(xcode APP 打包以及提交apple审核详细流程(新版本更新提交审核))  ...

制作应用程序安装包完整流程

第一步:快速体验 首先,我们可以来快速体验一下用InstallShield制作的安装程序是什么样的。 当然,我不可能详细到怎样建立一个项目之类的问题,有关这方面的内容还请看InstallShi...
  • ghevinn
  • ghevinn
  • 2013年02月26日 15:38
  • 5750

发布IOS应用程序到苹果APP STORE完整流程

参考:http://blog.csdn.net/mad1989/article/details/8167529(xcode APP 打包以及提交apple审核详细流程(新版本更新提交审核)) htt...
  • hr8610
  • hr8610
  • 2014年07月24日 10:01
  • 694

发布IOS应用程序到苹果APP STORE完整流程

参考:http://blog.csdn.net/mad1989/article/details/8167529(xcode APP 打包以及提交apple审核详细流程(新版本更新提交审核)) h...

分享个INNO打包Windows应用程序完整实例脚本

最近手贱,把以前写的一个完整的INNO打包脚本给删了,于是又得到处找资料学习。现在分享一个完整的脚本代码,以后就不会找不到了。脚本为完整diamante,包括了这些基本的功能:写注册表、检测程序是否正...
  • mfcing
  • mfcing
  • 2015年02月09日 18:14
  • 2638

windows phone 8 锁屏界面 显示应用程序的消息提醒

自己的应用程序如果有推送消息,希望能在锁屏界面获得提示,像未接电话和未读短信一样。 创建一个24*24的PNG图片,用于锁屏界面显示。放入程序根目录下。打开文件WMAppManifest.xml...

Windows应用程序常用消息

WM_LBUTTONDOWN产生单击鼠标左键的消息该消息包含了长参数(IParam)和字参数(wParam)IParam 低字节:包含当前光标的x坐标值 x = LOWORD(IParam); 高字...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在WINDOWS应用程序中,消息从产生到被处理的完整流程
举报原因:
原因补充:

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