Добрый день дорогие пользователи nookery.ru! Сегодня поговорим о том как запретить пользователю запускать вторую копию своей программы. С этой проблемой часто сталкиваются начинающие программисты, на самом деле решение не совсем тривиальное и имеет несколько решений, давайте рассмотрим их.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace NotTwoCopy { class Program { static Mutex m_mutex; [STAThread] static void Main(string[] args) { if (InstanceExists()) { return; } Console.WriteLine("Приложение запущено, нажмите Enter для закрытия приложения"); Console.ReadLine(); } static bool InstanceExists() { bool createdNew; m_mutex = new Mutex(false, "OneInstanceApplication", out createdNew); return(!createdNew); } } }
Тут мы создаем именованный объект Mutex. Который позволяет определить запущенна ли копия программы, и в случаи запуска копи закрывает ее.
Еще один вариант это проверка всех запущенных процессов по имени, и в случаи нахождения копии мы ее закрываем.
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Text; using System.Threading; using System.Threading.Tasks; //www.nookery.ru namespace NotTwoCopy { class Program { [STAThread] static void Main(string[] args) { Process process = RunningInstance(); if (process!=null) { Console.WriteLine("Программа уже запущена"); return; } Console.WriteLine("Приложение запущено, нажмите Enter для закрытия приложения"); Console.ReadLine(); } public static Process RunningInstance() { Process current = Process.GetCurrentProcess(); Process[] processes = Process.GetProcessesByName(current.ProcessName); //перебираем все процессы foreach (Process process in processes) //Игнорируем текущий процесс if (process.Id != current.Id) { //Делаем проверку, на то что бы определить запущен ли процесс из того же файла if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName) { // Да, это и есть копия нашего приложения return process; } } //Индетичный процессов не найдено return null; } } }