这是我的主循环:
while(TRUE)
{
PeekMessage(&msg,hWnd,PM_REMOVE);
if (msg.message==WM_QUIT)
break;
TranslateMessage(&msg);
dispatchMessage(&msg);
}
这是我的回调程序:
LRESULT CALLBACK WinProc(HWND hWnd,UINT msg1,WParaM wParam,LParaM lParam)
{
switch(msg1)
{
case WM_DESTROY :
{
PostQuitMessage(0);
return 0;
}
break;
}
return DefWindowProc(hWnd,msg1,wParam,lParam);
}
我发现当我按下关闭按钮时,下一个循环中的PeekMessage函数将返回WM_NCLBUTTONDOWN,而没有WM_QUIT!
correct way做一个消息循环是
BOOL bRet;
MSG msg;
while ((bRet = GetMessage(&msg,0)) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
dispatchMessage(&msg);
}
}
如果你真的需要,你可以使用PeekMessage ……但为什么你忽略了返回值?
另请注意,这是特定于窗口的.我相信PostQuitMessage是一个线程…我不记得它在我的头顶,但你可能需要传递NULL而不是hWnd.
如果你有任何其他窗口,也可能劫持他们的消息循环 – 我不认为这通常是一个问题,但它可能是一个;记在脑子里.