调用CreateWindow或CreateWindowEx创建窗口返回空句柄时,我们总是会调用GetLastError看下错误码,就知道具体错误的原因(比如窗口类未注册),但如果GetLastError返回0没有报错,是怎么回事呢?
阅读CreateWindow API说明文档,梳理下CreateWindow的主要内部实现过程:
第一,系统创建窗口资源,获得一个窗口句柄。
第二,SendMessage发送WM_CREATE消息,消息处理函数WndProc处理WM_CREATE消息,返回处理结果
第三,如果处理结果为0,窗口创建成功返回窗口句柄,如果处理结果非0,销毁窗口,返回空句柄。
所以,CreateWindow返回空句柄而GetLastError返回0是因为未正确处理WM_CREATE消息,返回非0值。
笔者自己遇到过两例未正确处理WM_CREATE消息:
第一,窗口处理函数没有处理WM_CREATE消息时,没有调用默认窗口处理函数 retrunDefWindowProc(…);
第二,窗口处理函数入口处写了一段代码,该段代码触发了ASSERT,也就是DebugBreak,但是程序没崩溃。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有