Windows程序的关闭过程
zyl910原创
-- Windows系统内核 -----
1.操作系统查询鼠标驱动,将鼠标操作翻译成Wndows消息并放入系统消息队列
2.在系统消息队列的鼠标消息利用发送WM_NCHITTEST消息得知该鼠标消息该发给那个窗口(的线程消息队列)
-- 应用程序 -------------
3.在该线程的消息循环中,GetMessage得到一条消息,并用DispatchMessage分发该消息到该窗口的窗口函数
4.由于关闭按键在非客户区,所以窗口函数收到的是WM_NCLBUTTONDOWN消息。由于应用程序一般不处理非客户区消息,该消息最终交给DefWindowProc函数
5.DefWindowProc函数处理WM_NCLBUTTONDOWN消息时,发现现在正点击在关闭按钮上,于是更新“关闭按钮”的图像,并用SetCapture设置鼠标捕获(这样鼠标消息会不断的发送到该窗口),还有一些界面性操作就不细说了(如设置浮动提示)
6.经历了许多WM_NCMOUSEMOV消息(谁敢说自己点鼠标时鼠标没颤动)后,DefWindowProc函数终于接受到了WM_LBUTTONUP消息。现在它判断鼠标坐标是否在关闭按钮的坐标范围内,若是,则表示真的是点了“关闭”,此时DefWindowProc函数会向窗口函数发送WM_SYSCOMMAND消息、SC_CLOSE参数
7.一般窗口函数不处理WM_SYSCOMMAND消息,所以该消息又传给了DefWindowProc(注意此时发生了重入现象)
8.DefWindowProc处理WM_SYSCOMMAND消息的策略是:用GetSystemMenu取得系统菜单,并检查SC_CLOSE菜单项是否可用,若可用,则发送向窗口函数发送WM_CLOSE消息
9.窗口函数一般对于WM_CLOSE消息的处理是:弹出一个对话框,问你是否退出。若否,窗口函数返回0。若是,将该消息传递给DefWindowProc继续操作(2次重入)
10.DefWindowProc调用DestroyWindow摧毁窗口
11.DestroyWindow在摧毁窗口前,向窗口函数发送WM_DESTROY消息通知窗口即将摧毁
12.窗口函数执行资源释放操作,若是主窗口则调用PostQuitMessage通知程序即将结束(只是标记状态,实际操作在下面),还依然调用DefWindowProc释放内部资源(3次重入),函数调用完后又回到DestroyWindow
13.DestroyWindow正式摧毁窗口及该窗口的子窗口(控件),完成后向窗口函数发送WM_NCDESTROY消息通知窗口已经摧毁
14.窗口函数和DefWindowProc一般不处理WM_NCDESTROY消息,只是简单的返回。此时再也没有任何操作,只有一连串的函数返回:DestroyWindow、WM_CLOSE、WM_SYSCOMMAND、WM_LBUTTONUP、DispatchMessage,最终回到了消息循环
15.由于PostQuitMessage做了标记,所以GetMessage返回0,退出消息循环,执行WinMain下面的代码(一般是释放程序资源的代码)
-- 编译器 --------------
16.WinMain执行完毕后,现在执行的是编译器插入的代码,用于释放全局变量(调用相应对象的析构函数)等资源释放操作
-- Windows -------------
17.当编译器代码执行完后,程序会回到Windows系统安排的线程启动代码,这将自动调用ExitThread及ExitProcess(主线程)结束线程
-- Windows内核 -----------
18.当某个线程、进程即将终止时,Windows调用各个dll的入口函数,通知线程、进程即将终止
19.进程真的要中止了,先将该进程的所有线程冻结(既这些线程再也不会分配到CPU时间片),再释放相关资源:dll、内核对象、虚拟内存空间
20.当上面的一切完成时,Windows再在进程列表中去掉该进程
Windows程序的关闭过程
最新推荐文章于 2023-02-12 22:46:07 发布