关于GETMESSAGE函数的一点疑问,麻烦高手给解释解释。
#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,就说明窗口被销毁了,直接返回。但是这个程序并没有退出啊,进程中仍然存在,请问这里该如何解释?到底是咋么回事?
...全文
相关推荐
RandRect.rar_getMessage
在分析和比较这两个函数时,通过实际的示例,如“RandRect.rar_getMessage”项目,可以帮助我们更直观地理解它们的工作机制和应用场景。
API函数集 中文解释
API函数集是操作系统提供给开发者用于实现特定功能的函数集合,它们涵盖了操作系统的核心功能,如网络操作、消息处理和文件管理等。以下是对这些API函数的详细解释:1.
WindowsAPI函数
**GetMessage** 和 **DispatchMessage**: 这两个函数是消息循环的基础。
利用钩子函数制作的键盘小程序.pdf
在探讨如何使用钩子函数来制作键盘小程序之前,需要对几个核心概念进行解释,以确保对文档内容有一个清晰的理解。
SetWindowsHook 函数 钩子类型定义.docx
WH_GETMESSAGE 钩子WH_GETMESSAGE 钩子应用程序使用这个钩子来监视从 GetMessage 或 PeekMessage 函数返回的消息。


界面
