我的Win32应用程序不会退出主循环

The*_*ist 7 c windows winapi

这是我的主循环:

    while(TRUE)
    {

    PeekMessage(&msg,hWnd,0,0,PM_REMOVE);
        if (msg.message==WM_QUIT)
            break;
        TranslateMessage(&msg);
        DispatchMessage(&msg);


    }
Run Code Online (Sandbox Code Playgroud)

这是我的回调程序:

 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);
}
Run Code Online (Sandbox Code Playgroud)

我发现当我按下关闭按钮时,下一个循环中的PeekMessage函数将返回WM_NCLBUTTONDOWN,而没有WM_QUIT!

Meh*_*dad 5

执行消息循环的正确方法

BOOL bRet;
MSG msg;
while ((bRet = GetMessage(&msg, hWnd, 0, 0)) != 0)
{ 
    if (bRet == -1)
    {
        // handle the error and possibly exit
    }
    else
    {
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    }
}
Run Code Online (Sandbox Code Playgroud)

PeekMessage如果你真的需要,你可以使用......但你为什么忽略返回值?

另请注意,这是特定于窗口的。我相信PostQuitMessage是一个线程......我不记得我的头顶,但你可能需要通过NULL而不是hWnd.

如果您有任何其他窗口,那也可能会劫持他们的消息循环——我认为这通常不是问题,但它可能是一个问题;记在脑子里。