3

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

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

4

1 回答 1

3

根据MSDN WM_CREATE是在CreateWindow. 所以你在创建过程中破坏了窗口。我不确定这是否应该有效。还有,为什么这么复杂?文件说

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

所以只要返回 -1 以防loadFiles()失败并相应地处理CreateWindow返回NULL

于 2013-04-30T08:33:54.650 回答