|
|
|
Как сделать, чтобы в данный момент работала только одна копия программы? using System;
using System.Threading;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;
class MyApplication: Form
{
public static void Main()
{
if (CheckOneInstance.IsInstanceExist(true))
return;
Application.Run(new MyApplication());
}
sealed class CheckOneInstance
{
static Mutex mutex;
//Создавать экземпляры этого класса нет смысла
CheckOneInstance()
{
}
public static bool IsInstanceExist(bool activateFirstInstance)
{
bool createdNew;
mutex = new Mutex(false, "My Mutex Name", out createdNew);
if (!createdNew)
{
if (!activateFirstInstance)
return true;
//получаем имя нашего процесса (название файла без
расширения '.exe')
string processName =
Process.GetCurrentProcess().MainModule.ModuleName;
processName = processName.Substring(0,
processName.IndexOf(".exe"));
Process currentProcess = Process.GetCurrentProcess();
//перебираем все процессы с искомым именем
foreach(Process process in
Process.GetProcessesByName(processName))
{
//текущий экземпляр нас не интересует
if (process.Id == currentProcess.Id)
continue;
//могут быть разные приложения с одинаковым именем
//исполняемого файла. Проверяем что-бы это был 'наш'
файл
if (process.MainModule.FileName !=
currentProcess.MainModule.FileName)
continue;
//Активизируем основное окно приложения
if (IsIconic(process.MainWindowHandle))
ShowWindow(process.MainWindowHandle,
SW_RESTORE);
else
SetForegroundWindow(process.MainWindowHandle);
break;
}
return true;
}
return false;
}
[DllImport("User32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("User32.dll")]
static extern bool IsIconic(IntPtr hWnd);
[DllImport("User32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
const int SW_RESTORE = 9;
}
}
|
|
|
|
|
|
|