2013-07-02 25 views
3

我們有一個傳統的C Windows應用程序,當發生致命的連接錯誤時,通過MessageBox調用彈出一個模式窗口。我們的網絡工程師可能一次運行許多這些應用程序。偶爾,網絡故障會導致這些應用程序處理的連接同時失敗。Windows MessageBox忽略WM_CLOSE

在Windows 7上,從任務欄中選擇「關閉所有窗口」功能確實有效,因爲模式對話框似乎沒有處理WM_QUIT消息。我通常在Linux系統上工作,但是我的MSDN研究表明,我可以捕獲並處理此消息的唯一方法是創建自己的對話框並自己處理消息。

我的擔心是我忽略了一個更簡單的解決方案,任何人都可以提供替代方案嗎?

+1

要關閉窗口發送一個'WM_CLOSE ',如果它是應用程序的主窗口,則應用程序也會結束。 'WM_QUIT'是結束整個應用程序,並關閉它擁有的所有窗口。 – alk

+0

「* ...從任務欄中選擇」關閉所有窗口「功能確實有效,因爲模式對話框似乎沒有處理WM_QUIT消息。*」我真的沒有遇到問題?你想關閉對話框彈出,或退出應用程序? – alk

+0

退出應用程序 –

回答

2

模態對話框的消息循環應該抓住WM_QUIT和響應呼叫EndDialog(),並通過使用PostMessage()WM_QUIT消息發送到應用程序的主窗口。


更新:

如上建議將工作,如果WM_QUIT將被髮送到模態對話框...的方法 - 但至少我現在的win7的機器上,這是不案件。

此外,它是主窗口收到WM_SYSCOMMANDwParam設置爲SC_CLOSE並以某種方式默認消息處理程序忽略它(這可能是由於模式對話框的風格的情況下......?我沒有調查這進一步)。

然而,把下面的分支到窗口的消息循環的switch下的條件描述由OP應該做結束該應用程序的工作:

... 

    case WM_SYSCOMMAND: 
    if (SC_CLOSE == wParam) 
    { 
     PostQuitMessage(<whatever code shall be returned>); 
    } 

    return DefWindowProc(...); 

    ... 
+0

測試和驗證!,突出,非常感謝:) –

+0

@GearoidMurphy:不客氣。不過,我也爲你的另一個問題添加了一個簡短的答案。 – alk

1

這可能是一個棘手的問題。

通常,要退出Windows應用程序,您必須退出「Windows消息循環」。最簡單的方法是發佈退出消息,例如PostQuitMessage(retCode),其中retCode是主消息循環處理程序可以處理的值。通常,零,即忽略。

通常,PostQuitMessage會響應WM_DESTROY消息發佈。

它確實取決於遺留代碼,你有我的同情心,我也處理遺留代碼。我的代碼有一個單獨的消息循環,並不斷顯示模態對話框。調用EndDialog並調用PostQuitMessage(0)正確終止我的應用程序。

+0

確實,這是一個棘手的問題。如果對工作解決方案感興趣,請參閱我的回答。 – alk

+1

順便說一句:換行增強readabiltiy ... ;-) – alk