要实现进程运行一个实例的功能容易,要在任何情况下都严格如此,不可能。至少有那么一瞬间也是有两个实例的。
不需要shutdown,直接main return即可。
如果是进程控制进程,那么直接判断process就可以了。
不需要Shutdown,发现已经运行了,就显示出来:
/// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { if (ProgramRunningChecker.IsRuning(Application.ProductName)) return; Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); }
private static Mutex m; /// <summary> /// 检查程序是否已经运行 /// </summary> /// <param name="programName">程序名称</param> public static bool IsRuning(string programName) { bool createdNew; //Global为全局,表示即使通过远程桌面连接过来,也只是允许运行一次 string mutexName = "Global\\" + programName; m = new Mutex(false, mutexName, out createdNew); if (!createdNew) { Process currentProcess = Process.GetCurrentProcess(); foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName)) { if (process.Id != currentProcess.Id) { SetForegroundProcess(process); break; } } } return !createdNew; }