2015-09-27 61 views
-1

原来的问题:

我不能不管我的窗口过程函数创建能够检测WM_CLOSE消息,并呼吁PostQuitMessage并让Windows后立即关闭窗口继续使用DefWindowProc处理窗口消息。窗口在Win32应用程序将无法正常关闭

但是,通过拖动标题栏移动窗口后,它似乎能够正常关闭。

为我的窗口过程函数的代码如下:

LRESULT CALLBACK OnEvent(HWND handle, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
     case WM_QUIT: 
     { 
      printf("WM_QUIT\n"); 
      break; 
     } 
     case WM_CLOSE: 
     { 
      printf("WM_CLOSE\n"); 
      PostQuitMessage(0); 
      return 0; 
     } 
    } 
    return DefWindowProc(handle, message, wParam, lParam); 
} 

因此,除了发送WM_MOVE消息给我的窗口或在WM_CLOSE情况下块使用exit(0),我怎么能保证我的窗口可以创建后立即关闭?

新问题:

传递NULLGetMessageWhWnd参数,而不是我的窗口句柄后,窗口关闭现在正确回答,因此我刚才的问题。

因此,为什么GetMessageW功能以前没有,唯一的窗口提供手柄检索WM_QUIT消息,而不是使用NULLhWnd参数?

+0

未测试,调用'PostQuitMessage(0);'和不调用'DefWindowProc'用于消息'WM_QUIT'可能不太好。 – MikeCAT

+0

它可能对您有用。 https://msdn.microsoft.com/en-us/library/windows/desktop/ff381396%28v=vs.85%29.aspx并且在'printf(“WM_QUIT \ n”);'之后,没有'打破;'。可以吗? –

+1

除非出现严重错误,否则'WM_QUIT'将永远不会传递到您的WndProc。 –

回答

5

一个正确写消息循环,永远不会分派WM_QUIT消息到窗口过程时,当它接收到WM_QUIT消息GetMessage()返回0,它会简单地打破循环:

GetMessage function

如果该函数检索WM_QUIT以外的消息,则返回值不为零。

如果该函数检索WM_QUIT消息,则返回值为零。

如果出现错误,则返回值为-1。例如,如果hWnd是一个无效的窗口句柄或者lpMsg是一个无效指针,则该函数失败。要获得扩展的错误信息,请调用GetLastError。

针对WM_CLOSE,你应该叫DestroyWindow(),而不是直接PostQuitMessage()(的DefWindowProc(WM_CLOSE)默认行为是调用DestroyWindow()你)。你需要一个WM_DESTROY处理那么应该调用PostQuitMessage()

LRESULT CALLBACK OnEvent(HWND handle, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
     case WM_CLOSE: 
     { 
      printf("WM_CLOSE\n"); 
      DestroyWindow(handle); 
      return 0; 
     } 

     case WM_DESTROY: 
     { 
      printf("WM_DESTROY\n"); 
      PostQuitMessage(0); 
      return 0; 
     } 
    } 
    return DefWindowProc(handle, message, wParam, lParam); 
} 

这是记录在MSDN:

Closing the Window

下面是从页流程图:

flow chart

至于GetMessage()问题,如果您阅读对于GetMessage()PostQuitMessage()的文档更加仔细,您将会看到,发送的WM_QUIT消息不是窗口消息。传递非NULL HWNDGetMessage()只会检索PostMessage()SendMessage()中用于该特定的邮件HWNDGetMessage()将忽略不旨在为HWND,其包括螺纹PostThreadMessage()PostQuitMessage()和消息的任何消息。传递一个NULL HWNDGetMessage()允许它返回任何未决的消息,包括WM_QUIT

这是危险的事,顺便说一句:The dangers of filtering window messages

+0

好吧,虽然我现在明白我的错误,但这很令人尴尬。 – benardier