在调试 this 示例期间,我注意到
WindowProc
在 CreateWindowEx
之后被调用。第一条消息是WM_GETMINMAXINFO
。我以为在消息循环中调用 WindowProc
后会第一次调用 DispatchMessage
:
while (GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
这对我来说并不直观。请解释一下为什么会这样?是否可以仅从消息循环中获取所有事件?
实际上,
CreateWindowEx()
之后消息并未发送。它是从该函数发送的。要点是,从同一个线程发送的(大多数)消息是同步的,即不是将消息插入消息队列,而是直接像普通函数一样调用目标窗口过程。
如果您考虑一下,它通常很有意义:例如,窗口过程需要在
WM_NCCREATE
返回之前处理 WM_CREATE
或 CreateWindowEx()
,以便调用者获得完全创建的窗口,这是一些有意义的初始化状态。
顺便说一句,不幸的是,对于任何顶级窗口,Windows 在
WM_GETMINMAXINFO
之前发送 WM_NCCREATE
,因此处理此消息可能需要特别小心,因为内部窗口的状态可能尚未初始化。