WinForm
WinForm下我们用互斥锁来解决
internal static class Program
{
// 互斥锁名字
private const string UniqueMutexName = "YuZhi.winformlearnmanager.Mutex";
// 全局的互斥锁变量
private static Mutex mutex;
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// 尝试获取互斥锁
mutex = new Mutex(true, UniqueMutexName, out bool createdNew);
// 如果互斥锁已经存在(即另一个实例在运行)
if (!createdNew)
{
Application.Exit();
return;
}
// 互斥锁是新创建的(即没有其他实例在运行),继续执行程序
Application.Run(new FrmLidarSetting());
// 确保在应用程序退出时释放互斥锁
mutex.ReleaseMutex();
mutex.Close();
}
}
使用using方式
internal static class Program
{
// 互斥锁名字
private const string UniqueMutexName = "JSC.jsclearn.Mutex";
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
using (var mutex = new Mutex(true, UniqueMutexName, out bool createdNew))
{
if (createdNew)
{
// 运行应用程序
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// 释放互斥锁
mutex.ReleaseMutex();
mutex.Close();
}
else
{
// 已经有一个实例在运行,不启动第二个实例
MessageBox.Show("应用程序已经在运行。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
Application.Exit(); // 退出当前实例
}
}
}
}
WPF
WPF中更简单了
private void Application_Startup(object sender, StartupEventArgs e)
{
Process[] p = Process.GetProcessesByName("CAATS_Client");
if (p.Length > 1)
{
Application.Current.Shutdown();
return;
}
HomeWin win = new HomeWin();
// Show the window
win.Show();
}