我习惯于认为WM_CREATE是窗口收到的第一条消息。但是,在顶级窗口上测试此假设时,结果却是错误的。在我的测试中,WM_MINMAXINFO显示为第一条消息。
那么,保证窗口收到的第一条消息是什么?
答案 0 :(得分:15)
WM_NCCREATE
实际上是very first message your window will receive,它将在WM_CREATE
之前到达。它与创建非客户区域(例如标题栏,系统菜单等)有关,因此与NC
前缀相关。
WM_GETMINMAXINFO
已发送before the window size/position is changed,可能会在WM_CREATE
之前到达(详见下文)。
WM_CREATE
消息在CreateWindow()
返回之前发送,因此您可以保证该点已执行每窗口初始化。创建窗口后,窗口变为可见(WM_CREATE
)之前,窗口过程将收到WM_SHOWWINDOW
。
实际上,MSDN文档中存在一个有趣的不一致 - 创建消息似乎取决于您是否调用CreateWindow()
或CreateWindowEx()
,但它没有指定消息必须按顺序列出派遣。
CreateWindow()
:WM_CREATE
,WM_GETMINMAXINFO
和WM_NCCREATE
CreateWindowEx()
:WM_NCCREATE
,WM_NCCALCSIZE
和WM_CREATE
我强烈怀疑CreateWindow()
中描述的邮件订单应首先WM_NCCREATE
,而常规WM_CREATE
最后一次,这与通知文档和CreateWindowEx()
一致参考(也与你描述的一致)。
Raymond Chen也有一些有趣的information on window creation/destruction。
它只是表明,即使看似简单的东西也会越复杂,你看它们就越多。
答案 1 :(得分:7)
你回答了自己的问题。在CreateWindowEx()甚至将句柄返回到正在创建的窗口之前,我也在Windows XP SP3上看到WM_GETMINMAXINFO,然后是WM_NCCREATE,WM_NCCALCSIZE,最后是WM_CREATE。什么garabage'
一般的答案是,在有序创建和销毁对象方面,Microsoft是无能的。他们弄错了Windows,COM和设备驱动程序。总有一些捕获22,其中一个物体是半创造的或半毁坏的,需要一些圆形的复杂解决方案来生产可靠的产品。
答案 2 :(得分:2)
通过实验获得的结果比仅信任源更好,特别是因为源是由大批程序员组成的,并且没有人知道所有代码。那说:
我收到的第一条消息是0x24(WM_GETMINMAXINFO)。
我可以假设它永远是第一条消息吗?不,因为Windows版本之间的代码更改,并且Microsoft没有记录保证是第一个收到的消息。
底线: 不要以为在另一条消息之前调用了WM_CREATE。
答案 3 :(得分:1)
您可以使用visual studio附带的spy ++来查看启动应用程序或窗口时生成的消息。