我是靠谱客的博主 长情豌豆,最近开发中收集的这篇文章主要介绍WINDOWS消息机制(二):从消息产生到被处理的完整流程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

整体过程分析

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

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

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

MSG msg;

while(GetMessage(msg, NULL, NULL, NULL))
{
      TranslateMessage(&msg);
      DispatchMessage(&msg);
}

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

 

GetMessage:从线程队列中取消息,取出后对应的消息会从队列中删除;若无消息,则阻塞

TranslateMessage:
把键盘消息转换成对应的ASCII字符内存,并重新放置于队列中,等待取出

DispatchMessage:
在注册窗口对象时,有如下代码:及设置对口的消息处理回调函数

WNDCLASS wc;
......
wc.lpfnWndProc = (WNDPROC)WndProc;
......

在窗口类的定义中,有如下代码:
DECLARE_MESSAGE_MAP()
......
BEGIN_MESSAGE_MAP(CMsgTestDlg, CDialog)
	......
	ON_MESSAGE(WM_USER_SEND_MSG, &CMsgTestDlg::HandleSendMsg)
	ON_MESSAGE(WM_USER_POST_MSG, &CMsgTestDlg::HandlePostMsg)
	......
END_MESSAGE_MAP()

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

 

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

问题:

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

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

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

 

转载于:https://my.oschina.net/myspaceNUAA/blog/64450

最后

以上就是长情豌豆为你收集整理的WINDOWS消息机制(二):从消息产生到被处理的完整流程的全部内容,希望文章能够帮你解决WINDOWS消息机制(二):从消息产生到被处理的完整流程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部