среда, 30 апреля 2008 г.

Запуск только одной копии программы

Продолжаю делиться сакральными знаниями :) Самым простым способом определить, запущена ли уже наша программа является использование класса Mutex. Для этого создадим вот такой вспомогательный класс. Его задача - проверить наличие мутекса и если его нет - создать новый.

    public class SingleInstance
    {
        private bool firstInstance = false;

        public bool FirstInstance
        {
            get { return firstInstance; }
        }

        public SingleInstance()
        {
            Mutex mutex=null;
            try
            {
                //Пытаемся получить мутекс, если он уже существует
                mutex = Mutex.OpenExisting("ИмяНашегоПриложения");
            }
            catch (WaitHandleCannotBeOpenedException e)
            {
                //Если получили ошибку - мутекс не существует
                firstInstance = true;
            }

            //Если null - создаем новый мутекс
            if (mutex == null)
            {
                mutex = new Mutex(false, "ИмяНашегоПриложения");
                
                //Чтобы слишком умный сборщик мусора не удалил наш мутекс делаем так:
                GC.KeepAlive(mutex);
            }
        }
    }
Следующим шагом является модификация Program.cs следующим образом

        [STAThread]
        static void Main()
        {
            SingleInstance single = new SingleInstance();

            if (single.FirstInstance)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new MainForm());
            }
        }
Соответственно - если single.FirstInstance == true, то наша программа запустится как обычно. В противном случае - сразу завершит свою работу. Еще один из способов предотвращения запуска копии нашей программы описан тут. Этот способ позволяет передать параметры командной строки при попытке запуска новой копии программы в текущую копию программы. Однако в реализации он более сложен.

Комментариев нет:

Отправить комментарий