如何检查应用程序的另一个实例是否正在运行

可能重复:
什么是创build单个实例应用程序的正确方法?
当用户试图打开一个新的实例时,返回到一个已经打开的应用程序

有人可以显示如何可以检查另一个程序实例(如test.exe)是否正在运行,如果是这样,停止应用程序加载,如果有一个现有的实例。

想要一些严肃的代码? 这里是。

var exists = System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1; 

这适用于任何应用程序(任何名称),并且如果有另一个 同一应用程序运行的实例,则会变为true

编辑:要解决您的需求,您可以使用这些:

 if (System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1) return; 

从你的主要方法退出方法…或

 if (System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1) System.Diagnostics.Process.GetCurrentProcess().Kill(); 

这将立即终止当前的加载过程。


您需要为.Count() 扩展方法添加对System.Core.dll的引用。 或者,您可以使用.Length属性。

不确定你的程序是什么意思,但是如果你想限制你的应用程序到一个实例,那么你可以使用一个Mutex来确保你的应用程序还没有运行。

 [STAThread] static void Main() { Mutex mutex = new System.Threading.Mutex(false, "MyUniqueMutexName"); try { if (mutex.WaitOne(0, false)) { // Run the application Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } else { MessageBox.Show("An instance of the application is already running."); } } finally { if (mutex != null) { mutex.Close(); mutex = null; } } } 

这是一些很好的示例应用程序。 以下是一种可能的方法。

 public static Process RunningInstance() { Process current = Process.GetCurrentProcess(); Process[] processes = Process.GetProcessesByName (current.ProcessName); //Loop through the running processes in with the same name foreach (Process process in processes) { //Ignore the current process if (process.Id != current.Id) { //Make sure that the process is running from the exe file. if (Assembly.GetExecutingAssembly().Location. Replace("/", "\\") == current.Mainmodulee.FileName) { //Return the other process instance. return process; } } } //No other instance was found, return null. return null; } if (MainForm.RunningInstance() != null) { MessageBox.Show("Duplicate Instance"); //TODO: //Your application logic for duplicate //instances would go here. } 

许多其他可能的方式。 看到替代的例子。

第一。

第二个。

第三个

编辑1:刚才看到你的评论,你有一个控制台应用程序。 这在第二个示例中讨论。

Process静态类有一个方法GetProcessesByName(),您可以使用它来搜索正在运行的进程。 只要搜索具有相同可执行文件名的其他进程即可。

你可以试试这个

 Process[] processes = Process.GetProcessesByName("processname"); foreach (Process p in processes) { IntPtr pFoundWindow = p.MainWindowHandle; // Do something with the handle... // } 

尝试查看此实例识别应用程序的codeplex项目 。