为什么在轮询事件之前调用窗口过程?

问题描述 投票:0回答:1

在调试 this 示例期间,我注意到

WindowProc
CreateWindowEx
之后被调用。第一条消息是
WM_GETMINMAXINFO
。我以为在消息循环中调用
WindowProc
后会第一次调用
DispatchMessage

while (GetMessage(&msg, NULL, 0, 0) > 0)
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

这对我来说并不直观。请解释一下为什么会这样?是否可以仅从消息循环中获取所有事件?

winapi
1个回答
0
投票

实际上,

CreateWindowEx()
之后消息并未发送。它是从该函数发送的。要点是,从同一个线程发送的(大多数)消息是同步的,即不是将消息插入消息队列,而是直接像普通函数一样调用目标窗口过程。

如果您考虑一下,它通常很有意义:例如,窗口过程需要在

WM_NCCREATE
返回之前处理
WM_CREATE
CreateWindowEx()
,以便调用者获得完全创建的窗口,这是一些有意义的初始化状态。

顺便说一句,不幸的是,对于任何顶级窗口,Windows 在

WM_GETMINMAXINFO
之前发送
WM_NCCREATE
,因此处理此消息可能需要特别小心,因为内部窗口的状态可能尚未初始化。

© www.soinside.com 2019 - 2024. All rights reserved.