【问题标题】:C++ Win32 PostQuitMessage(0) not working? CPU @ 100%C++ Win32 PostQuitMessage(0) 不工作? CPU @ 100%
【发布时间】:2013-04-30 03:43:19
【问题描述】:

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

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 发布到消息队列,这也会破坏子窗口,对吗?有什么帮助吗?谢谢

【问题讨论】:

  • 您显示的代码没有任何问题,因此您尚未显示的代码肯定有问题。使用调试器找出代码卡住的地方。
  • return 0;放在你的WM_DESTROYWM_CASE case下是没有意义的,因为你已经在它们下面声明了break,它最终会在破解后return 0。我看不出你的代码有什么问题。也许它与您的其他代码有关?
  • 尝试使用PostMessage()而不是SendMessage()发送WM_CLOSE

标签: winapi


【解决方案1】:

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

如果应用程序处理此消息,它应该返回零到 继续创建窗口。 如果应用程序返回 –1,则 窗口被破坏并且 CreateWindowEx 或 CreateWindow 函数 返回一个 NULL 句柄。

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

【讨论】:

  • 这正是我一直在寻找的,而不是在创建过程中尝试发送销毁消息,返回 -1 将无法首先创建窗口。谢谢,它成功了跨度>
猜你喜欢
  • 2021-01-24
  • 2015-04-19
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
  • 2017-08-21
  • 2012-01-17
  • 1970-01-01
相关资源
最近更新 更多