【发布时间】: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_DESTROY和WM_CASEcase下是没有意义的,因为你已经在它们下面声明了break,它最终会在破解后return 0。我看不出你的代码有什么问题。也许它与您的其他代码有关? -
尝试使用
PostMessage()而不是SendMessage()发送WM_CLOSE?
标签: winapi