关于GETMESSAGE函数的一点疑问,麻烦高手给解释解释。

yiruirui0507 yiruirui0507 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
#include<windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
static TCHAR szAppName[]=TEXT("HelloWin");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);

wndclass.hInstance=hInstance;
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=szAppName;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);
return 0;
}
hwnd=CreateWindow(szAppName,TEXT("The Hello Program"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
BOOL bRet;
while((bRet=GetMessage(&msg,hwnd,0,0))!=0)
{
if(bRet==-1)
{

return -1;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(message)
{
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);
DrawText(hdc,TEXT("Hello Windows 98!"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}


问题如下:
BOOL bRet;
while((bRet=GetMessage(&msg,hwnd,0,0))!=0)
{
if(bRet==-1)
{

return -1;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
GetMessage(&msg,NULL,0,0) 就没有出现问题,MSDN中解释说,当为NULL的时候接受所有消息,还有什么线程消息等等。
当用hwnd的时候接受的是窗口的消息,
用hwnd的时候比如上面代码,关闭窗口之后进程中还有此进程,并没有结束。
我认为:窗口是销毁了,进程没结束,原因在于
当点关闭的时候会触发wm_destroy消息,这里跟WM_CLOSE有什么区别吗?还有一个WM_QUIT,这三个消息分别是什么意思?
触发WM_DESTROY消息,则OS把此消息插入到了当前应用程序的消息队列中,
然后应用程序从消息队列中取出WM_DESTROY消息,此时完成窗口的销毁,然而应用程序继续执行GETMESSAGE,此时的HWND已经是个无效的东西了,所以GETMESSAGE返回-1,于是出现死循环,-1也属于非0为真。

以上是分析,我的上述代码就是针对这个分析写的
我进行了判断,如果bRet=-1,就说明窗口被销毁了,直接返回。但是这个程序并没有退出啊,进程中仍然存在,请问这里该如何解释?到底是咋么回事?
...全文

相关推荐

评论 15
收藏 已收藏
分享
返回顶部
yiruirui0507
界面 15,976 成员 115,866 内容