2015-09-27 85 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