【问题标题】:PostQuitMessage() Wont close my app?PostQuitMessage() 不会关闭我的应用程序?
【发布时间】:2009-08-29 02:29:26
【问题描述】:

我正在尝试在 win32 中编写 hello world,但是当我关闭主窗口时,应用程序继续运行

我的窗口程序:

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    switch (msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hWnd, msg, wparam, lparam);
}

事件循环:

while ((bret = GetMessage(&msg, hWndMain, 0, 0) != 0)
{
    if (bret == -1)
    {
        DWORD error = GetLastError();
        return 1;
    }
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

现在,然后我通过单击右上角 x 获得 WM_DESTROY,而不是 GetMessage() 返回 0 表示获得 WM_QUIT,而是返回 -1 并且 GetLastError() 抱怨错误 1400,即“无效窗把手” ...我很困惑。

【问题讨论】:

    标签: c winapi


    【解决方案1】:

    通常你会将 NULL 而不是窗口句柄传递给GetMessage(),这可以解释为什么你会得到ERROR_INVALID_WINDOW_HANDLE,因为在WM_DESTROY 和朋友完成后,窗口将不再存在。 PostQuitMessage() 发布的 WM_QUIT 是线程消息,所以带句柄的 GetMessage 永远不会被接收到。

    这是一个实现细节,但 PostQuitMessage 甚至不会发布真正的消息,它只是线程存储的一个标志,GetMessage 会在需要时自动生成消息,请参阅this blog post 了解更多详细信息。

    【讨论】:

      【解决方案2】:

      我个人是这样做的:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-21
        • 1970-01-01
        • 2019-01-08
        • 1970-01-01
        • 2015-07-03
        • 2012-06-30
        • 1970-01-01
        相关资源
        最近更新 更多