日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

关闭主窗体而不退出主程序 以及如何获取操作系统的关闭、注销信息

發布時間:2025/5/22 windows 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关闭主窗体而不退出主程序 以及如何获取操作系统的关闭、注销信息 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如何做到點擊主窗體"X"按鈕,能隱藏窗體,而不退出主程序?讓我們先來分析窗體所響應的幾個事件的先后順序:

一. 當前用戶點擊窗體"關閉",右上角上的"X"圖標時的系統消息的響應順序是:
? 1. 系統截獲用戶的點擊消息,可通過重載 WndProc截獲;
? 2. 觸發窗體的 FormClosing 事件;
? 3. 關閉窗體,回收本窗體所占用的相應資源;

二. 當在程序中用 this.Close() 關閉窗體時,系統響應的順序是:
?? 1. 觸發窗體的 FormClosing 事件;
?? 2. 關閉窗體,回收本窗體所占用的相應資源;

三. 當用戶關閉操作系統時,窗體響應的順序是:
?? 1. 觸發窗體的 FormClosing 事件;
?? 2. 觸發窗體的 SystemEvents_SessionEnding 事件;
?? 3. 關閉窗體,回收本窗體所占用的相應資源;
??
因此當我們希望在點擊主窗體"X"圖標時,不希望程序退出,而只是最小化并隱藏窗體,則最好是通過重載 WndProc,截獲點擊該按鈕事件,實現窗體最小化,從而達到不退出主程序的目的.
而不是簡單的在FormClosing 事件中加上 e.Cancel=true; 那樣在關閉或注銷系統時,就不能自動關閉該窗體(程序)了;

經過以上分析,我們只需在窗體中加上以下代碼即可:

?protected?override?void?WndProc(ref???Message?m)
????????
{
????????????
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說明;

總結

以上是生活随笔為你收集整理的关闭主窗体而不退出主程序 以及如何获取操作系统的关闭、注销信息的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。