При своем запуске приложение пытается создать мьютекс с определенным именем. Если это удалось, то запускаемый экземпляр приложения является первым и пока единственным. В противном случае Mutex не позволит вновь запустить пока еще работающее приложение Поэтому, данный класс мы и используем в нашем случае:
using System;
using System.Windows.Forms;
using System.Threading;
namespace OneCopyOfApp
{
static class Program
{
private static Mutex m_instance;
private const string m_appName = "NameOfMyApp";
[STAThread]
static void Main()
{
bool tryCreateNewApp;
m_instance = new Mutex(true, m_appName,
out tryCreateNewApp);
if (tryCreateNewApp)
{
Application.EnableVisualStyles();
Application.
SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
return;
}
}
}
}
Есть второй, более безопасный в отношении атак способ. Основан он на библиотеках VB. Для начала добавьте ссылку на сборку Microsoft.VisualBasic.dll.
Для удобства вынести в начало проекта пространство имен Microsoft.VisualBasic.ApplicationServices. Ну а сам код следующий (обратите внимание каким образом мы вызываем метод Run())
using System;
using System.Windows.Forms;
using System.Threading;
using Microsoft.VisualBasic.ApplicationServices;
namespace OneCopyOfApp
{
public class OneInstanceApp :
WindowsFormsApplicationBase
{
private SingleInstanceApplication()
{
base.IsSingleInstance = true;
}
public static void Run(Form form,
StartupNextInstanceEventHandler startupHandler)
{
OneInstanceApp app =
new OneInstanceApp();
app.MainForm = form;
app.StartupNextInstance += startupHandler;
app.Run(Environment.GetCommandLineArgs());
}
}
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
OneInstanceApp.Run(new Form1(),
StartupNextInstanceHandler);
}
static void StartupNextInstanceHandler(
object sender, StartupNextInstanceEventArgs e)
{
MessageBox.Show(e.CommandLine[0]);
}
}
}
using System;
using System.Windows.Forms;
using System.Threading;
namespace OneCopyOfApp
{
static class Program
{
private static Mutex m_instance;
private const string m_appName = "NameOfMyApp";
[STAThread]
static void Main()
{
bool tryCreateNewApp;
m_instance = new Mutex(true, m_appName,
out tryCreateNewApp);
if (tryCreateNewApp)
{
Application.EnableVisualStyles();
Application.
SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
return;
}
}
}
}
using System;
using System.Windows.Forms;
using System.Threading;
using Microsoft.VisualBasic.ApplicationServices;
namespace OneCopyOfApp
{
public class OneInstanceApp :
WindowsFormsApplicationBase
{
private SingleInstanceApplication()
{
base.IsSingleInstance = true;
}
public static void Run(Form form,
StartupNextInstanceEventHandler startupHandler)
{
OneInstanceApp app =
new OneInstanceApp();
app.MainForm = form;
app.StartupNextInstance += startupHandler;
app.Run(Environment.GetCommandLineArgs());
}
}
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
OneInstanceApp.Run(new Form1(),
StartupNextInstanceHandler);
}
static void StartupNextInstanceHandler(
object sender, StartupNextInstanceEventArgs e)
{
MessageBox.Show(e.CommandLine[0]);
}
}
}
Комментариев нет:
Отправить комментарий