Windows API: какое первое сообщение окно гарантированно получит?

Я привык думать, что WM_CREATE-это первое сообщение, которое получает окно. Однако при тестировании этого предположения в окне верхнего уровня оно оказывается ложным. В моем тесте WM_MINMAXINFO появился как первое сообщение.

Итак, какое первое сообщение гарантированно получит окно?

4 ответов


вы ответили на свой вопрос. Я тоже вижу WM_GETMINMAXINFO в Windows XP SP3, а затем WM_NCCREATE, WM_NCCALCSIZE и, наконец, WM_CREATE, прежде чем CreateWindowEx() даже вернул дескриптор в создаваемое окно. Что garabage'

общий ответ заключается в том, что Microsoft некомпетентна, когда дело доходит до упорядоченного создания и уничтожения объектов. Они ошибаются в windows, COM и драйверах устройств. Всегда есть какая-то Уловка-22, где объект находится наполовину созданный или наполовину разрушенный, что требует некоторого Окольного запутанного решения для производства надежного продукта.


WM_NCCREATE на самом деле самое первое сообщение, которое получит ваше окно, который прибудет перед WM_CREATE. Это связано с созданием неклиентской области (например. заголовок, системное меню и т. д.), Следовательно,NC префикс.

WM_GETMINMAXINFO отправлено перед изменением размера/положения окна, и может прибыть до WM_CREATE (см. ниже).

на WM_CREATE сообщение отправлено до CreateWindow() returns, поэтому вы можете гарантировать это к этому моменту была выполнена инициализация каждого окна. Ваше окно proc получит 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 также имеет некоторые интересные информация о создании/уничтожении окна.

это просто показывает, что даже кажущиеся простыми вещи могут стать сложными, чем больше вы на них смотрите.


результаты экспериментов, лучше просто доверять источнику, тем более что источник состоит из легион программистов, и никто не знает, весь код. Тот сказал:

кулаком сообщение я получаю 0x24 (WM_GETMINMAXINFO).

Я могу предположить, что это всегда будет первое сообщение? Нет, поскольку изменение кода между версиями windows и Microsoft не задокументировало сообщение, гарантированно полученное первым.

дно линия: Не предполагайте, что WM_CREATE был вызван перед другим сообщением.


вы можете использовать spy++, который поставляется с visual studio, чтобы увидеть, какие сообщения генерируются при запуске приложения или окна.