問題描述:
在最近的windows程序中,由于實現(xiàn)了winform程序點擊窗口的關(guān)閉按鈕,不直接退出程序,而是將程序最小化到托盤中,這樣當(dāng)程序沒有退出之前,直接關(guān)機(jī)會導(dǎo)致關(guān)機(jī)不能正常進(jìn)行。
問題原因:
操作系統(tǒng)會在用戶點擊關(guān)機(jī)后,發(fā)送一個關(guān)閉的消息到當(dāng)前運行的應(yīng)用程序,這個消息的ID號問0x11,這樣當(dāng)應(yīng)用程序接受到消息后就會關(guān)閉自身,然后操作系統(tǒng)就可正常關(guān)閉了。但是我們在實現(xiàn)了上面的功能后,會在FormClosing事件中添加一段代碼,
e.Cancel = true;
//最小化到托盤
NormalToMinimized();
這樣我們雖然實現(xiàn)了功能,但是在接受到操作系統(tǒng)發(fā)送來的關(guān)閉窗口的消息的時候,就不能關(guān)閉程序了。
解決方案:
1.在應(yīng)用程序的主窗口添加一個私有的標(biāo)識,用來標(biāo)識,關(guān)閉窗口的事件是由用戶點擊引起的還是由操作系統(tǒng)發(fā)送的小心引起的。
2.在應(yīng)用程序主窗口中添加對系統(tǒng)消息的處理,這個處理的過程需要重寫窗口的窗口過程,也就是窗口處理操作系統(tǒng)消息的方法。
protected override void WndProc(ref Message m) { if (m.Msg == 0x11) { //自定義的事件觸發(fā)標(biāo)識,為true時表示窗口的關(guān)閉事件是由操作系統(tǒng)的關(guān)機(jī)操作引起的。 isExitAppFalg = true; } base.WndProc(ref m); }
3.修改FormClosing事件的處理過程,添加一個判斷就可以了
if (!isExitAppFalg) { e.Cancel = true; //最小化到托盤 NormalToMinimized(); }
這樣就把實現(xiàn)功能所帶了的副作用給解決了。