方法1:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Threading;
using System.Reflection;
static class Program
{
private static Mutex singleton;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
bool has=Check() ;
if (has)
{
Form form = new Form1();
form.FormClosed += new FormClosedEventHandler(form_FormClosed);
Application.Run(form);
}
else {
MessageBox.Show("程序已启动");
}
}
static void form_FormClosed(object sender, FormClosedEventArgs e)
{
if (singleton != null) {
singleton.Close();
}
}
private static bool Check() {
bool has=false;
singleton=new Mutex(false,Assembly.GetExecutingAssembly().FullName,out has);
// Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName;
return has;
}
}
}
方法2:
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Process instance = RunningInstance(); //Get the running instance.
if (instance == null)
{
//There isn 't another instance, show our form.
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
else
{
Message.WriteErrMsg("程序已运行,请勿再次运行!");
}
}
public static Process RunningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName);
//Loop through the running processes in with the same name
foreach (Process process in processes)
{
//忽略当前进程
if (process.Id != current.Id)
{
//Make sure that the process is running from the exe file.
if (Assembly.GetExecutingAssembly().Location.Replace("/ ", "\\ ") == current.MainModule.FileName)
{
//Return the other process instance.
return process;
}
}
}
//No other instance was found, return null.
return null;
}
}
方法1:不能避免多用户时的情况,多用户登陆系统时,还是可以开启多个实例的。
方法2:检查系统进程,可以解决多用户的问题,推荐方法2.