好的,所以我有我的主窗口程序(简化):
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发布到消息队列,这会破坏子窗口以及对吗?有帮助吗?感谢
答案 0 :(得分:3)
根据MSDN WM_CREATE
在CreateWindow
期间发送。所以你在创作过程中正在摧毁窗户。我不确定这应该有效。还有,为什么这么复杂?文档说
如果应用程序处理此消息,则应返回零 继续创建窗口。 如果应用程序返回-1,则为 窗口被销毁,CreateWindowEx或CreateWindow函数 返回一个NULL句柄。
因此,如果loadFiles()
失败,则返回-1,并相应地处理CreateWindow
NULL
。