C#Winform實現程式關閉隱藏窗體,二次程式啟動時顯示
思路:本程式啟動時候,儲存當前窗體控制代碼到檔案,
關閉時候隱藏窗體,不殺死程序,不退出.
下次啟動無需重新建立窗體,直接顯示原窗體,可以實現安卓程式的程序後臺隱藏效果.
點選桌面圖示,又同時可以防止多個程序多開的現象,避免多個程序衝突
好處:登入過的使用者,無需重新登入,系統後臺程序不關閉與伺服器的連線
廢話不多說,帖原始碼
(注:本文用到的RsConfig類為自定義檔案類,主要以Key,Value形式儲存控制代碼,暫不提供原始碼,如需修改,請自行定義)
新建WINFORM程式,找到Program.cs檔案,進行修改
using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using System.Runtime.InteropServices;//這是用到DllImport時候要引入的包 using System.Diagnostics; namespace WindowsFormsTest { static class Program { [DllImport("user32.dll")] private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow); private const int SW_HIDE = 0; //常量,隱藏 private const int SW_SHOWNORMAL = 1; //常量,顯示,標準狀態 private const int SW_SHOWMINIMIZED = 2; //常量,顯示,最小化 private const int SW_SHOWMAXIMIZED = 3; //常量,顯示,最大化 private const int SW_SHOWNOACTIVATE = 4; //常量,顯示,不啟用 private const int SW_RESTORE = 9; //常量,顯示,回覆原狀 private const int SW_SHOWDEFAULT = 10; //常量,顯示,預設 public static RsConfig rsConf = null;// 定義全域性檔案 public static string strPathFile = System.AppDomain.CurrentDomain.BaseDirectory + "config.rs";// 檔案全域性路徑 /// <summary> /// 應用程式的主入口點。 /// </summary> [STAThread] static void Main() { rsConf = new RsConfig(strPathFile);// 檔案類宣告 int nHand = Int32.Parse(rsConf.get("handle"));// 獲得檔案中的控制代碼(字串型別)// 轉整型 IntPtr intPtr = (IntPtr)nHand;// 轉控制代碼 // 顯示該控制代碼的視窗,如果沒有顯示則返回false bool b = ShowWindowAsync(intPtr, SW_SHOWNORMAL); // 如果沒有返回true說明沒有視窗,正常建立程序 if (!b) { //沒有執行的程序 Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } } }
主程式寫完了,下面就要對窗體做出具體的控制,在load事件中獲得當前窗體的控制代碼,並且儲存到檔案中
後面的事情就是將關閉按鈕,ALT+F4響應事件,以及某些自定義關閉按鈕進行修改,去掉關閉的程式碼改成下面兩行using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices;//這是用到DllImport時候要引入的包 using System.Diagnostics; namespace WindowsFormsTest { public partial class Form1 : Form { [DllImport("user32.dll")] private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow); Private void Form1_Load(object sender, EventArgs e) { Program.rsConf.set("handle", this.Handle.ToString()); Program.rsConf.save(); } } }
Process current = Process.GetCurrentProcess();// 獲取當前程序
ShowWindowAsync(current.MainWindowHandle, 0);// 隱藏窗體
這樣可就可以實現程式唯一執行,並且類似於安卓或蘋果的後臺程序效果了!
C#初學,還不是特別熟,有些想法還是類似於MFC下的C語言程式設計的思路,如果哪裡不對,請多指教
哎,真是不太會弄這個佈局,改了好幾次,湊合看吧