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