Добрый день дорогие пользователи nookery.ru! Сегодня поговорим о том как запретить пользователю запускать вторую копию своей программы. С этой проблемой часто сталкиваются начинающие программисты, на самом деле решение не совсем тривиальное и имеет несколько решений, давайте рассмотрим их.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
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. Который позволяет определить запущенна ли копия программы, и в случаи запуска копи закрывает ее.
Еще один вариант это проверка всех запущенных процессов по имени, и в случаи нахождения копии мы ее закрываем.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
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; } } } |