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

问题描述:

行,所以我有我的主窗口(简体):C++ Win32 PostQuitMessage(0)不工作? CPU @ 100%

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)和..什么也没有。该进程仍然坐在后台,现在用100%的CPU核心1.这是我的消息循环:

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

使用各种不同的循环很简单,我环顾四周,看到的人,最有PeekMessage()函数..其值得注意的是我有几个子窗口包含不同的控件,当用户选择不同的标签时,我显示并隐藏它们,但我不认为这很重要,因为PostQuitMessage(0)应该将WM_QUIT发布到消息队列,它会破坏孩子的窗户以及?任何帮助?谢谢

+1

您显示的代码没有问题,所以它必须是您尚未显示的代码的问题。使用调试器来找出代码卡住的位置。 – 2013-04-30 03:54:01

+0

在你的'WM_DESTROY'和'WM_CASE'的情况下放置'return 0;'是没有意义的,因为你已经在它们的下面声明了'break',最终在中断后返回0。我没有看到你的代码有什么问题。也许它与你的其他代码有关? – CLearner 2013-04-30 05:30:33

+3

尝试使用'PostMessage()'而不是'SendMessage()'发送'WM_CLOSE'? – 2013-04-30 07:28:11

根据MSDNWM_CREATECreateWindow期间发送。所以你在创作过程中正在摧毁窗户。我不确定这是否应该起作用。另外,为什么这么复杂?该文档说

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

所以才返回-1万一loadFiles()失败,处理CreateWindow返回NULL相应。

+0

这正是我正在寻找的,而不是尝试在创建过程中发送销毁消息,返回-1将无法创建窗口的第一位..谢谢你,它的工作 – 2013-04-30 17:20:56