Windows API:窗口保证接收的第一条消息是什么?

时间:2009-11-16 10:27:00

标签: winapi windows-messages

我习惯于认为WM_CREATE是窗口收到的第一条消息。但是,在顶级窗口上测试此假设时,结果却是错误的。在我的测试中,WM_MINMAXINFO显示为第一条消息。

那么,保证窗口收到的第一条消息是什么?

4 个答案:

答案 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_CREATEWM_GETMINMAXINFOWM_NCCREATE
  • CreateWindowEx()WM_NCCREATEWM_NCCALCSIZEWM_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 ++来查看启动应用程序或窗口时生成的消息。