如何强制C#.net应用程序在Windows中只运行一个实例?

可能重复:
什么是创build单个实例应用程序的正确方法?

如何强制C#.net应用程序在Windows中只运行一个实例?

我更喜欢类似于以下的互斥解决scheme。 就这样,如果它已经被加载,它将重新关注应用程序

using System.Threading; [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SetForegroundWindow(IntPtr hWnd); /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { bool createdNew = true; using (Mutex mutex = new Mutex(true, "MyApplicationName", out createdNew)) { if (createdNew) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } else { Process current = Process.GetCurrentProcess(); foreach (Process process in Process.GetProcessesByName(current.ProcessName)) { if (process.Id != current.Id) { SetForegroundWindow(process.MainWindowHandle); break; } } } } } 

在.net(C#)中强制运行一个程序的一个例程在program.cs文件中使用此代码:

 public static Process PriorProcess() // Returns a System.Diagnostics.Process pointing to // a pre-existing process with the same name as the // current one, if any; or null if the current process // is unique. { Process curr = Process.GetCurrentProcess(); Process[] procs = Process.GetProcessesByName(curr.ProcessName); foreach (Process p in procs) { if ((p.Id != curr.Id) && (p.MainModule.FileName == curr.MainModule.FileName)) return p; } return null; } 

和以下:

 [STAThread] static void Main() { if (PriorProcess() != null) { MessageBox.Show("Another instance of the app is already running."); return; } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form()); } 

这是我在我的应用程序中使用的:

 static void Main() { bool mutexCreated = false; System.Threading.Mutex mutex = new System.Threading.Mutex( true, @"Local\slimCODE.slimKEYS.exe", out mutexCreated ); if( !mutexCreated ) { if( MessageBox.Show( "slimKEYS is already running. Hotkeys cannot be shared between different instances. Are you sure you wish to run this second instance?", "slimKEYS already running", MessageBoxButtons.YesNo, MessageBoxIcon.Question ) != DialogResult.Yes ) { mutex.Close(); return; } } // The usual stuff with Application.Run() mutex.Close(); } 

另一种单一实例应用程序的方法是检查他们的哈希总和。 在互斥之后(没有工作,因为我想)我得到它的工作方式:

  [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SetForegroundWindow(IntPtr hWnd); public Main() { InitializeComponent(); Process current = Process.GetCurrentProcess(); string currentmd5 = md5hash(current.MainModule.FileName); Process[] processlist = Process.GetProcesses(); foreach (Process process in processlist) { if (process.Id != current.Id) { try { if (currentmd5 == md5hash(process.MainModule.FileName)) { SetForegroundWindow(process.MainWindowHandle); Environment.Exit(0); } } catch (/* your exception */) { /* your exception goes here */ } } } } private string md5hash(string file) { string check; using (FileStream FileCheck = File.OpenRead(file)) { MD5 md5 = new MD5CryptoServiceProvider(); byte[] md5Hash = md5.ComputeHash(FileCheck); check = BitConverter.ToString(md5Hash).Replace("-", "").ToLower(); } return check; } 

它只通过进程ID检查md5总和。

如果find了这个应用程序的一个实例,它就会关注正在运行的应用程序并退出。

你可以重命名它,或者做你想要的文件。 它不会打开两次,如果MD5哈希是相同的。

可能有人有build议吗? 我知道这是回答,但也许有人正在寻找一个互斥的select。