关于Windows消息的几个问题。

mdcire 2018-03-09 11:00:45
都说Windos是基于消息响应机制的,有几个小白问题想请教一下大家:
1.Windos的消息(WM_XXXX)是不是只发给窗口程序还是一个非窗口程序只写一个GetMessage就能得到所有消息?
2.当一个消息产生时,处理流程是什么?系统是广播出去的吗?即:系统针对一个消息遍历当前系统所有进程,每个进程里面再发给每个线程,再看线程中是否处理这个消息。如果不是这样的流程,那应该是怎么样的?某个进程中的某个线程运行一个窗口程序,这个窗口程序是如何得到系统的消息呢?
3.在MFC中,当一个类继承自CWnd,然后只需Create后就能接收消息了,不需要showwindow或者domodal之类的,那么消息是如何发给这个窗口呢?我的意思是Create并没有阻塞创建它的线程,那消息是如何分发过去的,使用windwos api创建窗口会使用while循环不断读取消息,相当于阻塞的线程,那Mfc窗口是如何做到不阻塞线程又能收消息的呢?
...全文
412 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-03-12
  • 打赏
  • 举报
回复
《深入浅出MFC》第9章  消息映射与命令绕行 Message Mapping and Command Routing 消息映射机制与命令绕行,活像是米诺托斯的迷宫, 是 MFC 最曲折幽深的神秘地带。 ……
mdcire 2018-03-12
  • 打赏
  • 举报
回复
引用 3 楼 VisualEleven 的回复:
MFC中也是这样的,只不过是while(GetMessage())这个消息循环被框架给隐藏了~
那按理来说while(GetMessage())会阻塞当前线程以不断接收消息,但是CWnd的Create窗口(没有showindow)之后并没有阻塞线程但是还能接收到消息,这个我有点困惑。
worldy 2018-03-12
  • 打赏
  • 举报
回复
1、每个线程会有一个消息队列 2、每个线程会创建很多窗口 3、无论消息是哪里来的,别人SendMessage、系统产生、窗口操作产生。。。。线程队列里的每个消息,都有一个目标窗口句柄, 4、GetMessage从线程队列取出一个消息,然后DispatchMessage,DispatchMessage会根据Msg参数的hWnd调用合适的窗口过程 5、MFC窗口的消息分发机制其实一样,窗口和其关联的类对象信息保存在MFC后台的一堆数据结构里,一个窗口接收到消息,根据后台数据,取出类对象,然后调用对象方法。
worldy 2018-03-12
  • 打赏
  • 举报
回复
引用 1 楼 CKRGD 的回复:
一个窗口程序在一个进程的主线程里,再多的窗口都在这个主线程里
可以另外创建线程,再由创建出来的线程创建窗口,但是,你这个线程必须创建消息循环,否则,创建出来的窗口会是断线的风筝
女神打Boss 2018-03-09
  • 打赏
  • 举报
回复
一个窗口程序在一个进程的主线程里,再多的窗口都在这个主线程里
Eleven 2018-03-09
  • 打赏
  • 举报
回复
MFC中也是这样的,只不过是while(GetMessage())这个消息循环被框架给隐藏了~
mdcire 2018-03-09
  • 打赏
  • 举报
回复
引用 1 楼 CKRGD 的回复:
一个窗口程序在一个进程的主线程里,再多的窗口都在这个主线程里
窗口程序在主线程中是这样的。我的意思是如果我使用CreateThread新建一个线程,让后在这个新的线程使用CWnd的Create的方式创建一个窗口,但是由于这个线程很快就结束了,所以这个创建的窗口是不会接收到再发的其他的消息。但是如果我不然这个新线程退出,这个新创建的窗口就能收到消息。我的问题是:CWnd的Create没有阻塞线程,不像使用windows api那样不断的while GetMessgae,MFC是CWnd是如何在不阻塞线程的情况下又保证在它的线程堆栈中创建的窗口可以收到消息?

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧