Вот как я подошел к этому
В классе Программы:
1. Получите System.Diagnostics.Process вашего приложения, используя Process.GetCurrentProcess ()
2. Просмотрите коллекцию открытых процессов с текущим именем вашего приложения, используя Process.GetProcessesByName (thisProcess.ProcessName)
3. Проверьте каждый процесс. Идентификатор против thisProcess.Id, и если экземпляр уже открыт, то как минимум 1 будет соответствовать имени, но не идентификатору, в противном случае продолжайте открывать экземпляр
using System.Diagnostics;
.....
static void Main()
{
Process thisProcess = Process.GetCurrentProcess();
foreach(Process p in Process.GetProcessesByName(thisProcess.ProcessName))
{
if(p.Id != thisProcess.Id)
{
// Do whatever u want here to alert user to multiple instance
return;
}
}
// Continue on with opening application
Приятным завершением этой работы было бы представление пользователю уже открытого экземпляра, скорее всего, они не знали, что он был открыт, поэтому давайте покажем им, что это было. Для этого я использую User32.dll для трансляции сообщения в цикл обмена сообщениями Windows, пользовательское сообщение, и мое приложение прослушивает его в методе WndProc, и если оно получает это сообщение, оно представляется пользователю, Form .Show () или еще много чего