Всем привет! Сегодня будем делать запрет на запуск двух процессов программы. То есть, если программа запущена, то ещё одно окно этой программы открыть не получиться. Идём в Program.cs, в метод Main(), в самом начале вписываем: if (Process.GetProcessesByName("MySoft").Length > 1) { MessageBox.Show("Программа уже запущена"); Application.Exit(); return; } Код if (Process.GetProcessesByName("MySoft").Length > 1) { MessageBox.Show("Программа уже запущена"); Application.Exit(); return; } Что делает код? Мы получаем количество процессов с именем MySoft (.exe вписывать не нужно) и проверяем на его количество, если больше одного процесса, то закрываем прогу. Почему именно > 1 ? Если просто сделать проверку на наличие процесса, то проверка всегда будет выдавать true, ибо при запуске программы процесс сразу же виден в системе
Почему именно > 1 ? Если просто сделать проверку на наличие процесса, то проверка всегда будет выдавать true, ибо при запуске программы процесс сразу же виден в системе
Тоже ненадежный способ, процесс переименовать могут, я такую шляпу использую, хотя посути проапгрейженая версия этого способа private static Process PriorProcess() { try { var curr = Process.GetCurrentProcess(); var 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; } catch (Exception) { return null; } } Код private static Process PriorProcess() { try { var curr = Process.GetCurrentProcess(); var 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; } catch (Exception) { return null; } } [STAThread] static void Main() { if (PriorProcess() != null) { return; } // ... Код [STAThread] static void Main() { if (PriorProcess() != null) { return; } // ... Можно еще через мьютексы, шоб уже наверняка
iPro_inactive, твой способ для тех, кому нужна защита от перегрузки сервера, буду юзать =) Закинь отдельной темой
[STAThread] private static void Main() { bool createdNew; // ReSharper disable once ObjectCreationAsStatement new Mutex(false, " ", out createdNew); if (!createdNew) { MessageBox.Show(@"Программа уже запущена.", @"Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Hand); return; } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } Код [STAThread] private static void Main() { bool createdNew; // ReSharper disable once ObjectCreationAsStatement new Mutex(false, " ", out createdNew); if (!createdNew) { MessageBox.Show(@"Программа уже запущена.", @"Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Hand); return; } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } Так не проще? Если изменить имя файла, всё равно не запустится программа второй раз.
Вот так ещё можно static Mutex mutex; /// <summary> /// Главная точка входа для приложения. /// </summary> [STAThread] static void Main() { bool created; Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); mutex = new Mutex(true, "3kGLX8ZS53zdL0", out created); if (!created) { MessageBox.Show("Error!", "", MessageBoxButtons.OK, MessageBoxIcon.Error); Application.Exit(); } Application.Run(new Form1()); mutex.Dispose(); } Код static Mutex mutex; /// <summary> /// Главная точка входа для приложения. /// </summary> [STAThread] static void Main() { bool created; Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); mutex = new Mutex(true, "3kGLX8ZS53zdL0", out created); if (!created) { MessageBox.Show("Error!", "", MessageBoxButtons.OK, MessageBoxIcon.Error); Application.Exit(); } Application.Run(new Form1()); mutex.Dispose(); }