代码位于空间代码区:<Windows编程实践1——写文字>
发现问题:
while(GetMessage(&msg, NULL, 0, 0 ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
在窗口过程中响应WM_DESTROY消息:
case WM_DESTROY:
PostQuitMessage(0);
return 0;
1、在消息循环时,若传递给GetMessage函数的第二个参数为hwnd, 则在关闭窗口后,后台应用程序进程并未关掉。
分析:
<1>PostQuitMessage函数
函数功能:该函数向系统表明有一个线程有终止请求。通常用来响应WM_DESTROY消息。
函数原型:void PostQuitMessage(int nExitCode);
参数:nExitCode :指定应用程序退出代码,此值被用作消息WM_QUIT的wParam参数。
备注:PostQuitMessage发送一个WM_QUIT给线程的消息队列并立刻返回,此函数向系统表明有一个线程请求在随后的某个时间终止;当线程的消息循环从消息队列中取出WM_QUIT消息后,应当退出消息循环并将控制传回给系统,返回给系统的退出值必须是WM_QUIT消息的wParam参数。
<2>GetMessage函数
函数功能:该函数从调用线程的消息队列中接收消息,该函数不接收属于其他线程或应用程序的消息,该函数会一直等待,直到从消息队列中得到一个可利用的消息后才返回。
函数原型:BOOL GetMessage(LPMSG lpMsg, HWND hwnd, UINT wMsgFilterMin, UINT wMsgFilterMax);
函数参数:wMsgFilterMin和wMsgFilterMax指定检索的消息的范围;
返回值:接收到WM_QUIT消息以外的消息,返回非零值;接收到WM_QUIT消息,返回零;出现错误,返回-1
备注:如果hwnd为NULL,则GetMessage接收属于调用线程窗口的消息,线程消息由函数PostThreadMessage寄送给调用线程,由PostThreadMessage寄送的线程消息,其消息hwnd值为NULL;另外,GetMessae不从消息队列中清除WM_PAINT消息,该消息将保存在消息队列中直到该消息处理完毕。
<3>、为什么当GetMessage函数的第二个参数是hwnd(先前创建的窗口句柄),应用程序并未真正退出?
MSDN中解释,WM_QUIT不与窗口相关(WM_QUIT的hwnd应该为NULL),当设置GetMessage的第二个参数为hwnd,就意味着GetMessage函数只接收与hwnd相关的消息,因此它不会接收到WM_QUIT消息,所以虽然应用程序主主窗口关闭了,但是消息循环还在进行,主程序并未退出。
延伸思考:
<1>、为什么会出现主窗口关闭,但是应用程序并未关闭?
原因:WM_DESTROY 是窗口正在关闭时发出的,也就是说,当窗口过程在响应WM_DESTROY消息时,窗口已经从视觉上被删除了,WM_QUIT消息是结束消息循环让主程序退出,在本次程序中,当GetMessage函数的第二个参数为hwnd, GetMessage不能接收到WM_QUIT消息,所以应用程序并未退出。
<2>、总结:WM_CLOSE 、WM_DESTROY、WM_QUIT的区别
http://blog.csdn.net/xiliang_pan/article/details/7178601