为何WindowProc在消息循环轮询事件前被调用?
Windows窗口创建时的消息触发机制说明
为什么CreateWindowEx会直接调用WindowProc
调用CreateWindowEx创建窗口时,Windows系统需要完成窗口的初始化流程:
- 系统要为窗口分配内部资源、初始化各类属性,其中就包含获取窗口的最小/最大尺寸限制,因此会立即向窗口过程发送
WM_GETMINMAXINFO消息。 - 这类消息属于非队列消息,系统会直接调用窗口过程进行处理,完全不需要经过消息队列,也就不用等消息循环里的
DispatchMessage执行。除了WM_GETMINMAXINFO,窗口创建阶段还会触发WM_NCCREATE、WM_NCCALCSIZE、WM_CREATE等非队列消息,都是在CreateWindowEx返回前就直接调用WindowProc的。
能否仅通过消息循环获取所有事件?
不能。Windows的消息分为两类:
- 队列消息:比如鼠标、键盘输入事件、定时器消息等,这类消息会进入消息队列,必须通过
GetMessage取出,再由DispatchMessage分发给窗口过程处理。 - 非队列消息:像窗口创建时的初始化消息、
WM_SETTEXT这类直接发送的消息,系统会直接调用目标窗口的窗口过程,不会进入消息队列,自然不会出现在你的消息循环流程里。
所以消息循环只能处理队列消息,非队列消息会被系统直接派发给WindowProc,和消息循环是否启动无关。
内容的提问来源于stack exchange,提问作者Irbis
相关产品推荐
相关产品推荐

