winapi - C++ Win32 PostQuitMessage(0) 不工作? CPU @ 100%

标签 winapi

好的,我有了我的主窗口过程(简化):

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CREATE:
        {
            if(!loadFiles())
                SendMessage(hwnd, WM_CLOSE, 0, 0);
        }
        break;

        case WM_CLOSE:
            DestroyWindow(hwnd);
            return 0;
        break;

        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        break;

        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

loadFiles() 是读取一些文本文件的函数。如果文件丢失,它会发布一条错误消息,然后返回 false。我通过发送 WM_CLOSE 消息来处理这个问题,该消息发送 WM_DESTROY?该程序调用 PostQuitMessage(0) 并且......什么都没有。该进程仍在后台,现在在核心 1 上使用 100% CPU。这是我的消息循环:

MSG Msg;
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
}
return Msg.wParam;

很简单,我环顾四周,看到人们使用各种不同的循环,大多数使用 PeekMessage() 函数。值得注意的是我有几个包含不同控件的子窗口,当用户选择时显示和隐藏它们不同的选项卡,但我认为这不重要,因为 PostQuitMessage(0) 应该将 WM_QUIT 发布到消息队列,这也会破坏子窗口,对吧?有什么帮助吗?谢谢

最佳答案

根据 MSDN WM_CREATECreateWindow 期间发送。所以你在创建过程中就破坏了窗口。我不确定这是否可行。还有,为什么这么复杂?文档说

If an application processes this message, it should return zero to continue creation of the window. If the application returns –1, the window is destroyed and the CreateWindowEx or CreateWindow function returns a NULL handle.

因此,如果 loadFiles() 失败,只需返回 -1 并相应地处理 CreateWindow 返回 NULL

关于winapi - C++ Win32 PostQuitMessage(0) 不工作? CPU @ 100%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16291807/

相关文章:

c# - PostMessage 参数从 32 位 C# 到 64 位 C++

c - C编译器引用实现

c++ - 在基于 ATL 的 C++ 对话框中向复选框添加工具提示

qt - 如何在无边框窗口中保持阴影

winapi - 创建 tagSECURITY_ATTRIBUTES 对象

c++ - 关于将字符串传递给 win32 api 函数

c++ - 使用window api关键设置和事件引起的死锁

c++ - 包含不透明文本和按钮的透明窗口

c++ - 调用 dll 函数 C++ rad studio xe3

c++ - 如何跟踪任何程序试图使用哪些网络端口?