0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: mutex, c#, winapi, winmain, windowsforms, process.getcurrentprocess().processname</p>
1
<p>Теги: mutex, c#, winapi, winmain, windowsforms, process.getcurrentprocess().processname</p>
2
<p>Бывают ситуации, когда должна выполняться строго одна копия приложения. Например, это связано с авторизацией на некотором сервисе или работой с внешними устройствами.</p>
2
<p>Бывают ситуации, когда должна выполняться строго одна копия приложения. Например, это связано с авторизацией на некотором сервисе или работой с внешними устройствами.</p>
3
<p>В<strong>WinAPI</strong>данная проблема решалась просто:<strong>WinMain</strong>получал указатель на прошлый экземпляр запущенной программы. В C# мне о такой возможности не известно. Существует по крайней мере два способа решения задачи: поиск процессов идентичных себе и установка<strong>Mutex</strong>.</p>
3
<p>В<strong>WinAPI</strong>данная проблема решалась просто:<strong>WinMain</strong>получал указатель на прошлый экземпляр запущенной программы. В C# мне о такой возможности не известно. Существует по крайней мере два способа решения задачи: поиск процессов идентичных себе и установка<strong>Mutex</strong>.</p>
4
<h2>Оба способа имеют как преимущества, так и недостатки</h2>
4
<h2>Оба способа имеют как преимущества, так и недостатки</h2>
5
<p>В первом случае поиск осуществляется по имени процесса, но всегда можно переименовать программу перед повторным запуском. Во втором случае возможна атака за счёт генерации такого же<strong>Mutex</strong>злоумышленником.</p>
5
<p>В первом случае поиск осуществляется по имени процесса, но всегда можно переименовать программу перед повторным запуском. Во втором случае возможна атака за счёт генерации такого же<strong>Mutex</strong>злоумышленником.</p>
6
<h2>Рассмотрим оба способа</h2>
6
<h2>Рассмотрим оба способа</h2>
7
<p>Вариант с Mutex:</p>
7
<p>Вариант с Mutex:</p>
8
static bool IsSingleInstance() { bool flag; Mutex mutex = new Mutex(true, "MY_UNIQUE_MUTEX_NAME", out flag); return flag; }<p>Вариант с процессом:</p>
8
static bool IsSingleInstance() { bool flag; Mutex mutex = new Mutex(true, "MY_UNIQUE_MUTEX_NAME", out flag); return flag; }<p>Вариант с процессом:</p>
9
if (Process.GetProcesses().Count(x=>x.ProcessName=="MyProcessName")>1) Process.GetCurrentProcess.Kill();<p>Имя процесса можно узнать с помощью<strong>Process.GetCurrentProcess().ProcessName</strong>. Кроме того, для<strong>WindowsForms</strong>существует отдельный способ запуска ровно одной копии приложения, но он выходит за рамки данной заметки.</p>
9
if (Process.GetProcesses().Count(x=>x.ProcessName=="MyProcessName")>1) Process.GetCurrentProcess.Kill();<p>Имя процесса можно узнать с помощью<strong>Process.GetCurrentProcess().ProcessName</strong>. Кроме того, для<strong>WindowsForms</strong>существует отдельный способ запуска ровно одной копии приложения, но он выходит за рамки данной заметки.</p>
10
<p><em>Есть вопрос? Напишите в комментариях!</em></p>
10
<p><em>Есть вопрос? Напишите в комментариях!</em></p>
11
11