c - PostQuitMessage() 不会关闭我的应用程序?

标签 c winapi

我试图在 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,这是“无效的”窗口句柄” ...我很困惑。

最佳答案

通常您会将 NULL 而不是窗口句柄传递给 GetMessage(),这可以解释为什么在 WM_DESTROY 之后您会得到 ERROR_INVALID_WINDOW_HANDLE和 friend 完成后,窗口将不复存在。 PostQuitMessage() 发送的 WM_QUIT 是线程消息,因此带有句柄的 GetMessage 永远不会拾取它。

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

关于c - PostQuitMessage() 不会关闭我的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1350262/

相关文章:

c++ - 右侧的非法 token ::

c++ - 如何在 Win32 上的 WS_EX_CLIENTEDGE "Edit"文本字段上打断文本行

c++ - 为什么我在使用 WideCharToMultiByte 时会得到错误的字符数组?

取决于 getchar 返回值的计数器给出错误的输出

c - 从字符数组中提取一组字符/字符串

c - 如何构造一个命名列表(一个 SEXP)以从使用 .Call() 调用的 C 函数中返回?

c++ - 从 ".exe"+ 偏移量读取内存?

c++ - 我在 c++ 中遇到错误 'PTHREAD_START_ROUTINE' 未在此范围内声明

c - 如何有选择地将二维数组的列或行传递给函数?

c - 文件操作复制一个 .mp3 文件以创建另一个相同的文件