Windows是消息驱动的操作系统。在Windows环境下编程必须熟练掌握Windows消息响应机制。
今天在练习Win32编程时碰到一个关于GetMessage函数的问题。这个问题之前一直没有引起过我的注意,但是今天
在网上搜索发现这个问题很多程序员都跟我一样处于一知半解的状态。
在Win32应用程序的主函数中有一段消息循环收发的代码:
while (GetMessage(&Msg, hWnd, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
在Debug环境下启动程序后点击关闭按钮可以正常关闭掉窗口,但是VS2008却无法正常退出执行状态(即应用程序没有正常返回)。于是我按如下步骤进行了Debug:
(1).在消息处理函数中WM_DESTORY的处理中设置断点,点击关闭按钮case WM_DESROTY代码段可以执行;
(2).当程序执行到case WM_DESROTY代码段之后再在主函数的TranslateMessage(&Msg)处设置断点
(3).按下F5发现程序可以执行到TranslateMessage(&Msg)处。
经过上述步骤Debug后发现当在WM_DESTORY消息处理过程中调用PostQuitMessage(0)函数后程序的消息循环代码段可以继续执行,但是按MSDN的描述PostQuitMessage函数会往线程的消息队列中插入一个WM_QUIT消息,而GetMessage函数在收到WM_QUIT消息后会返回一个非正数。
后来在网上搜索网友克塞前来拜访的一段解释:
对PostQuitMessage而言,它实际上并不发送WM_QUIT消息,他所做的实际是设置一些特殊的系统标志,而队列存取体系根据这个标志并结合一些比较
今天在练习Win32编程时碰到一个关于GetMessage函数的问题。这个问题之前一直没有引起过我的注意,但是今天
在网上搜索发现这个问题很多程序员都跟我一样处于一知半解的状态。
在Win32应用程序的主函数中有一段消息循环收发的代码:
while (GetMessage(&Msg, hWnd, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
在Debug环境下启动程序后点击关闭按钮可以正常关闭掉窗口,但是VS2008却无法正常退出执行状态(即应用程序没有正常返回)。于是我按如下步骤进行了Debug:
(1).在消息处理函数中WM_DESTORY的处理中设置断点,点击关闭按钮case WM_DESROTY代码段可以执行;
(2).当程序执行到case WM_DESROTY代码段之后再在主函数的TranslateMessage(&Msg)处设置断点
(3).按下F5发现程序可以执行到TranslateMessage(&Msg)处。
经过上述步骤Debug后发现当在WM_DESTORY消息处理过程中调用PostQuitMessage(0)函数后程序的消息循环代码段可以继续执行,但是按MSDN的描述PostQuitMessage函数会往线程的消息队列中插入一个WM_QUIT消息,而GetMessage函数在收到WM_QUIT消息后会返回一个非正数。
后来在网上搜索网友克塞前来拜访的一段解释:
对PostQuitMessage而言,它实际上并不发送WM_QUIT消息,他所做的实际是设置一些特殊的系统标志,而队列存取体系根据这个标志并结合一些比较