Продолжаю делиться сакральными знаниями :)
Самым простым способом определить, запущена ли уже наша программа является использование класса
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, то наша программа запустится как обычно. В противном случае - сразу завершит свою работу.
Еще один из способов предотвращения запуска копии нашей программы описан
тут. Этот способ позволяет передать параметры командной строки при попытке запуска новой копии программы в текущую копию программы. Однако в реализации он более сложен.
Комментариев нет:
Отправить комментарий