之所以有這個功能,是不想再給後臺和前臺寫一套通訊機制的情況下偷懶的辦法! 之前發現在主函數裡面寫方法,第二次啟動程式打開新窗體或是顯示隱藏窗體!最後卻發現在主函數裡面打開的新窗體和原啟動的程式並不是共用一個緩存的! 於是乎想了一個比較歪的辦法,原窗體設置計時器之類的檢測變化,利用外部文件的變化,進行 ...
之所以有這個功能,是不想再給後臺和前臺寫一套通訊機制的情況下偷懶的辦法!
之前發現在主函數裡面寫方法,第二次啟動程式打開新窗體或是顯示隱藏窗體!最後卻發現在主函數裡面打開的新窗體和原啟動的程式並不是共用一個緩存的!
於是乎想了一個比較歪的辦法,原窗體設置計時器之類的檢測變化,利用外部文件的變化,進行窗體的展示、隱藏和打開,這樣實際上還是在原程式上打開的新窗體!
外部文件使用什麼都可以,文本、config、xml之類的!
這個是寫在主函數裡面的,用來檢測是否二次啟動:
Process[] processcollection = Process.GetProcessesByName(Application.CompanyName); // 如果該程式進程數量大於,則說明該程式已經運行,則彈出提示信息並提出本次操作,否則就創建該程式 if (processcollection.Length > 1) { string ss=ConfigurationManager.AppSettings["MainFlag"]; if (ss=="0") { SetConfigValue("MainFlag", "1"); } } else { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // 運行該應用程式 Application.Run(new FormClient()); }
這個是計時器里的檢測:
string mainflag = GetConfigValue("MainFlag"); if (mainflag == "1") { SetConfigValue("MainFlag","3"); FormMain fm = new FormMain(); fm.Show(); }
關閉新打開窗體的時候需要標記還原回去。
修改和讀取config:
/// <summary> /// 獲取AppSettings中某一節點值 /// </summary> /// <param name="key"></param> public static string GetConfigValue(string key) { Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); if (config.AppSettings.Settings[key] != null) return config.AppSettings.Settings[key].Value; else return string.Empty; } /// <summary> /// 修改AppSettings中配置 /// </summary> /// <param name="key">key值</param> /// <param name="value">相應值</param> public static bool SetConfigValue(string key, string value) { try { Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); if (config.AppSettings.Settings[key] != null) config.AppSettings.Settings[key].Value = value; else config.AppSettings.Settings.Add(key, value); config.Save(ConfigurationSaveMode.Modified); ConfigurationManager.RefreshSection("appSettings"); return true; } catch { return false; } }
不知道還有沒有不利用外部文件的方式,達到這種效果!或者有著更好的方式,歡迎交流指導!!!