方式1:
/// <summary> /// 應用程序的主入口點。 /// </summary> [STAThread] static void Main() { //獲取欲啟動進程名 string strProcessName = System.Diagnostics.Process.GetCurrentProcess().ProcessName; ////獲取版本號 //CommonData.VersionNumber = Application.ProductVersion; //檢查進程是否已經啟動,已經啟動則顯示報錯信息退出程序。 if (System.Diagnostics.Process.GetProcessesByName(strProcessName).Length > 1) { MessageBox.Show("CtiAgentClient呼叫中心客戶端已經運行!", "消息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); Application.Exit(); return; } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new frmMain()); }
方式2:
第一種方式:利用Mutex互斥量實現同時只有一個進程實例在運行 static class Program { /// <summary> /// 應用程序的主入口點。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //控制當前程序已經打開(即啟動) //方式1:利用Mutex互斥量實現同時只有一個進程實例在運行 //互斥鎖(Mutex) //互斥鎖是一個互斥的同步對象,意味着同一時間有且僅有一個線程可以獲取它。 //互斥鎖可適用於一個共享資源每次只能被一個線程訪問的情況 bool flag = false; System.Threading.Mutex hMutex = new System.Threading.Mutex(true, Application.ProductName, out flag); bool b = hMutex.WaitOne(0, false); /*上面的參數說明: 第一個參數【initiallyOwned】:true:指示調用線程是否應具有互斥體的初始所有權 (老實說沒理解透) 第二個參數【name】:程序唯一name,(當前操作系統中)判定重復運行的標志 第三個參數【createdNew】:返回值,如果檢測到已經啟動則返回(false)。 */ if (flag) { //沒有啟動相同的程序 Application.Run(new MainForm()); } else { MessageBox.Show("當前程序已在運行,請勿重復運行。"); Environment.Exit(1);//退出程序 } } }