WIN32第一个窗口程序,遇到问题求助啊

IT保安 2015-01-10 10:52:46
经典的“win32第一个窗口”程序,我依葫芦画瓢写好之后,发现窗口关闭之后,停留在
任务管理器之中,这就代表线程实际未退出,消息循环还在继续的意思吧?

我经过仔细检查,发现是消息循环这一块有问题,我把代码显示出来:
MSG msg;
bool bRet;
while((bRet = GetMessage(&msg,hWnd,0,0)) != 0)
{
if(bRet == -1)
{
return -1;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}


这段代码是我看MSDN关于GetMessage函数的介绍中,底部有这么一个 Warning Because the return value can be nonzero, zero, or -1, avoid code like this:

while (GetMessage( lpMsg, hWnd, 0, 0)) ... ,因此参照其推荐格式写的,但是却导致问题!

我将这一部分改写成
MSG Msg;
while(GetMessage(&Msg,NULL,0,0))//NULL表示接受调用线程的所有消息
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);//将消息传递给了窗口过程去处理
}


就一切正常了!对此我很费解,搞不懂,希望得到指点!
...全文
247 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengzhixi 2015-01-10
  • 打赏
  • 举报
回复
看看你的窗口句柄是否有效吧
allenltiverson 2015-01-10
  • 打赏
  • 举报
回复
引用 3 楼 u010982299 的回复:
推荐你看看这篇文章 http://linuxtest.blog.163.com/blog/static/199927088201262610059761/
+
greex 2015-01-10
  • 打赏
  • 举报
回复
MSG Msg; while(GetMessage(&Msg,NULL,0,0)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } --一直这样用,从未研究过细节。。。惨啊,整天忙于copy了。
纵横车 2015-01-10
  • 打赏
  • 举报
回复
写hWnd只接受和这个窗口以及这个窗口的子窗口有关的消息,写NULL则属于调用线程的窗口(其实屏幕的句柄就是0)的消息。 而一个程序完整的关闭过程是 1.按窗口右上角的X,这时将发送WM_CLOSE, 2.处理WM_CLOSE消息(这里只表示窗口即将销毁),再向窗口发送WM_DESTROY消息, 3.处理WM_DESTROY消息(这里窗口就真的销毁了),再发送WM_QUIT到消息队列。 4.GetMessage到WM_QUIT就返回0,跳出消息循环,程序结束。(一get到就跳出,所以回调函数是接收不到WM_QUIT的) 以下是我自己理解的,没验证过。 第三步的时候窗口已经销毁了,hWnd也失效了,WM_QUIT也不往窗口发。如果再GetMessage(&msg,hWnd,0,0)是get不到WM_QUIT的,就一直不退出。
true__false 2015-01-10
  • 打赏
  • 举报
回复
IT保安 2015-01-10
  • 打赏
  • 举报
回复
句柄应该OK的,我有判断
if(hWnd == NULL)
	{
		MessageBox(NULL,"创建窗口失败",NULL,0);
		return 1;
	}
现在问题解决了,我把while((bRet = GetMessage(&msg,hWnd,0,0)) != 0)这段代码中的hWnd置换为NULL, 窗口关闭后,进程也正常关闭了!请问原因是什么?

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧