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

标签 c windows winapi

这是我的主循环:

    while(TRUE)
    {

    PeekMessage(&msg,hWnd,0,0,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);
}

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

最佳答案

correct way做一个消息循环是

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); 
    }
}

如果确实需要,您可以使用 PeekMessage...但是为什么要忽略返回值?

另请注意,这是特定窗口。我相信 PostQuitMessage 是用于一个线程...我不记得了,但你可能需要传递 NULL 而不是 hWnd

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

关于c - 我的 Win32 应用程序不会退出主循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10805253/

相关文章:

C:表达式求值中的隐式转换和整数溢出

python - 当工作目录位于 UNC 路径而非映射驱动器上时调用 subprocess.Popen()

css - HTA - Windows 小工具 flex 的边缘

windows - 如何在 Windows 7 Aero 任务预览中创建自己的控件?

c - 如何将字节流转换为另一种编码?

c++ - C/C++ 使用自动递归文件夹/目录创建复制文件

c - C 中的结构复制,其中结构是元素

c - GDB - 将串行输出(从 dmesg)重定向到文件,而不是 gdb 输出/TUI?

c - 如何使用C语言找到目录中具有相同扩展名的所有文件?

windows - 更正 Windows API 以查找 CurrentControlSet\Control\MediaProperties?