11

私は、WM_CREATE がウィンドウが受け取る最初のメッセージであると考えてきました。ただし、トップレベル ウィンドウでこの仮定をテストすると、間違っていることがわかります。私のテストでは、WM_MINMAXINFO が最初のメッセージとして表示されました。

では、ウィンドウが受け取ることが保証されている最初のメッセージは何でしょうか?

4

4 に答える 4

17

WM_NCCREATEは、実際にはウィンドウが受け取る最初のメッセージであり、 の前に到着しWM_CREATEます。これは、非クライアント領域 (タイトル バー、システム メニューなど) の作成に関連しているため、NC接頭辞が付けられています。

WM_GETMINMAXINFOウィンドウのサイズ/位置が変更される前に送信され、前に到着する場合がありますWM_CREATE(詳細については以下を参照してください)。

WM_CREATEメッセージは返される前に送信されるため、CreateWindow()ウィンドウごとの初期化がその時点までに実行されたことを保証できます。ウィンドウ プロシージャはWM_CREATE、ウィンドウが作成された後、ウィンドウが表示される前に受け取ります ( WM_SHOWWINDOW)。

CreateWindow()実際、MSDN のドキュメントには興味深い矛盾があります。作成メッセージは、またはを呼び出すかどうかによって異なるようですがCreateWindowEx()、メッセージが必ずしもディスパッチ順にリストされているとは指定されていません。

  • CreateWindow():とWM_CREATE_WM_GETMINMAXINFOWM_NCCREATE
  • CreateWindowEx(): WM_NCCREATEWM_NCCALCSIZE、およびWM_CREATE

で説明されているメッセージの順序CreateWindow()WM_NCCREATE最初で、通常WM_CREATEの最後が必要であると強く思います。これは、通知ドキュメントとCreateWindowEx()リファレンスと一致しています (また、説明した内容とも一致しています)。

Raymond Chen も、ウィンドウの作成/破棄に関する興味深い情報を提供しています

一見単純に見えるものでも、見れば見るほど複雑になることがあるということです。

于 2009-11-16T10:38:10.370 に答える
4

実験による結果は、ソースを信頼するよりも優れています。特に、ソースは多数のプログラマーによって構成されており、すべてのコードを知っている人はいないためです。それは言った:

私が受け取る最初のメッセージは0x24(WM_GETMINMAXINFO)です。

それが常に最初のメッセージになると思いますか?いいえ、Windowsのバージョン間でコードが変更されており、Microsoftは、最初に受信されることが保証されているメッセージを文書化していないためです。

結論:WM_CREATEが別のメッセージの前に呼び出されたと想定しないでください。

于 2011-03-06T16:00:45.803 に答える
2

Visual Studio に付属の spy++ を使用して、アプリケーションまたはウィンドウの起動時に生成されるメッセージを確認できます。

于 2009-11-20T12:04:44.437 に答える