关闭主窗体而不退出主程序 以及如何获取操作系统的关闭、注销信息
如何做到點擊主窗體"X"按鈕,能隱藏窗體,而不退出主程序?讓我們先來分析窗體所響應的幾個事件的先后順序:
一. 當前用戶點擊窗體"關閉",右上角上的"X"圖標時的系統消息的響應順序是:
? 1. 系統截獲用戶的點擊消息,可通過重載 WndProc截獲;
? 2. 觸發窗體的 FormClosing 事件;
? 3. 關閉窗體,回收本窗體所占用的相應資源;
二. 當在程序中用 this.Close() 關閉窗體時,系統響應的順序是:
?? 1. 觸發窗體的 FormClosing 事件;
?? 2. 關閉窗體,回收本窗體所占用的相應資源;
三. 當用戶關閉操作系統時,窗體響應的順序是:
?? 1. 觸發窗體的 FormClosing 事件;
?? 2. 觸發窗體的 SystemEvents_SessionEnding 事件;
?? 3. 關閉窗體,回收本窗體所占用的相應資源;
??
因此當我們希望在點擊主窗體"X"圖標時,不希望程序退出,而只是最小化并隱藏窗體,則最好是通過重載 WndProc,截獲點擊該按鈕事件,實現窗體最小化,從而達到不退出主程序的目的.
而不是簡單的在FormClosing 事件中加上 e.Cancel=true; 那樣在關閉或注銷系統時,就不能自動關閉該窗體(程序)了;
經過以上分析,我們只需在窗體中加上以下代碼即可:
????????{
????????????const?int?WM_SYSCOMMAND?=?0x0112;
????????????const?int?SC_CLOSE?=?0xF060;
????????????if?(m.Msg?==?WM_SYSCOMMAND?&&?(int)m.WParam?==?SC_CLOSE)
????????????{
????????????????this.WindowState?=?FormWindowState.Minimized;
????????????????this.Hide();
??????????????
????????????????MessageBox.Show("click?close?button");
????????????????return;
????????????}
????????????base.WndProc(ref???m);
????????}
四. 截獲系統的關閉,注銷信息
只需在程序Main()函數中為主窗體添加SystemEvents_SessionEnding事件;
?Form1?frmMain?=?new?Form1();
?SystemEvents.SessionEnding?+=?new?SessionEndingEventHandler(frmMain.SystemEvents_SessionEnding);
在Form1 窗體中添加如下代碼,以響應關機,注銷或重啟事件:
?internal?void?SystemEvents_SessionEnding(object?sender,?SessionEndingEventArgs?e)
????????{
????????????string?exitType?=?e.Reason.ToString().Trim().ToUpper();
????????????MessageBox.Show(exitType);
????????????string?msgTitle?=?"";
????????????string?msgQuestion?=?"";
????????????if?(exitType.Contains("SHUTDOWN"))
????????????{
?????????????????msgTitle?=?"關機";
?????????????????msgQuestion?=?"真的要關機嗎?";
????????????}
????????????else?if?(exitType.Contains("LOGOFF"))
????????????{
????????????????msgTitle?=?"注銷";
????????????????msgQuestion?=?"真的要注銷嗎?";
????????????}
????????????DialogResult?result?=?MessageBox.Show(msgQuestion?,?msgTitle?,?MessageBoxButtons.YesNo);
????????????e.Cancel?=?(result?==?DialogResult.No);
????????}
補充說明:
?? SystemEvents 類 (用于提供對系統事件通知的訪問。)來獲取用戶注銷或關閉系統信息;
?? 可查看MSDN說明;
總結
以上是生活随笔為你收集整理的关闭主窗体而不退出主程序 以及如何获取操作系统的关闭、注销信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 技嘉bios怎么设置usb启动 技嘉BI
- 下一篇: 在DWR中实现直接获取一个JAVA类的返