为什么在消息循环前WM_CREATE等等消息会被处理?

oysoft 2009-09-12 10:49:37
一个win32程序,都是创建窗口,显示窗口再进入消息循环。不过在创建窗口和显示窗口时系统发出了许多消息,
例如WM_GETMINMAXINFO,WM_NCCREATE,WM_CREATE等等消息。
我问的为什么这些消息的处理会在消息循环(GetMessage循环体)前。也就是这些消息没有经过消息循环就调用了窗口处理函数。这是怎么做的?
麻烦说说原理,不要网站或者教程空泛的概念。
...全文
108 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
oysoft 2009-09-14
  • 打赏
  • 举报
回复
这是我找到的资料:
收到的第一个消息WM_CREATE

不会进入消息队列,而是由CreateWindow直接调用WndProc,见《Programming Windows》第三章中的说明:

"The very first message that a window procedure receives—and the first that HELLOWIN's WndProc chooses to process—is WM_CREATE. WndProc receives this message while Windows is processing the CreateWindow function in WinMain. That is, when HELLOWIN calls CreateWindow, Windows does what it has to do and, in the process, Windows calls WndProc with the first argument set to the window handle and the second argument set to WM_CREATE (the value 1). WndProc processes the WM_CREATE message and returns controls back to Windows. Windows can then return to HELLOWIN from the CreateWindow call to continue further progress in WinMain. "
xylicon 2009-09-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 oysoft 的回复:]
呵呵,这到提醒了我。
我上网搜索了一下,得到的结果是:收到这些消息,例如WM_CREATE不会进入消息队列,而是由CreateWindow直接调用WndProc。
[/Quote]

MSDN
CreateWindow sends WM_CREATE, WM_GETMINMAXINFO, and WM_NCCREATE messages to the window。

貌似还是用SendMessage的方法。
oysoft 2009-09-12
  • 打赏
  • 举报
回复
呵呵,这到提醒了我。
我上网搜索了一下,得到的结果是:收到这些消息,例如WM_CREATE不会进入消息队列,而是由CreateWindow直接调用WndProc。
Chivalry 2009-09-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dirdirdir3 的回复:]
引用 4 楼 oysoft 的回复:
我开始也是这样想的,不过我在单步调试的发现。还没有进入GetMessage循环体,窗口处理函数已经被调用,而且如果是等到GetMessage循环体到来之后再获取这些消息,在分发消息,处理。也不会出现父窗口和子窗口消息交替出现的事情了。因为只有全部子窗口创建完成后,父窗口的显示更新窗口才开始。


因为SendMessage不需要get,因此可能使用的是Sendmessage
[/Quote]

赞同你的观点
Chivalry 2009-09-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oysoft 的回复:]
我开始也是这样想的,不过我在单步调试的发现。还没有进入GetMessage循环体,窗口处理函数已经被调用,而且如果是等到GetMessage循环体到来之后再获取这些消息,在分发消息,处理。也不会出现父窗口和子窗口消息交替出现的事情了。因为只有全部子窗口创建完成后,父窗口的显示更新窗口才开始。
[/Quote]

确实如此
dirdirdir3 2009-09-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oysoft 的回复:]
我开始也是这样想的,不过我在单步调试的发现。还没有进入GetMessage循环体,窗口处理函数已经被调用,而且如果是等到GetMessage循环体到来之后再获取这些消息,在分发消息,处理。也不会出现父窗口和子窗口消息交替出现的事情了。因为只有全部子窗口创建完成后,父窗口的显示更新窗口才开始。
[/Quote]

因为SendMessage不需要get,因此可能使用的是Sendmessage
oysoft 2009-09-12
  • 打赏
  • 举报
回复
我开始也是这样想的,不过我在单步调试的发现。还没有进入GetMessage循环体,窗口处理函数已经被调用,而且如果是等到GetMessage循环体到来之后再获取这些消息,在分发消息,处理。也不会出现父窗口和子窗口消息交替出现的事情了。因为只有全部子窗口创建完成后,父窗口的显示更新窗口才开始。
sailtoyouSCU 2009-09-12
  • 打赏
  • 举报
回复
队列机制
dirdirdir3 2009-09-12
  • 打赏
  • 举报
回复
消息是一个队列来的,发布了命令不一定就会马上处理(除了sendmessage),也就是只有在消息循环的时候窗口才会真正的显示出来............
这个有点像异步处理的socket.........
Chivalry 2009-09-12
  • 打赏
  • 举报
回复
我的理解是这样的,windows的消息循环是从消息队列里面取出消息,然后分发给窗口处理函数,在GetMessage循环体之前的产生的WM_GETMINMAXINFO,WM_NCCREATE,WM_CREATE等等消息被放入了消息队列,等到GetMessage循环体到来之后,获取这些消息,在分发消息,处理

16,472

社区成员

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

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

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