using System.Threading; //需手动添加引用
static void Main()
{
bool initiallyOwned = true;
bool isCreated;
Mutex m = new Mutex( initiallyOwned, "MyTest", out isCreated); //Mutex为System.Thread;中的类
if ( !(initiallyOwned && isCreated) )
{
MessageBox.Show( "抱歉,程序只能在一台机上运行一个实例!", "提示" );
Application.Exit();
}
else
{
Application.Run( new MainForm() );
}
}
方法二:
直到现在,为了在Windows下满足上述约束,开发者最常用的方法仍然是使用有名互斥体(named mutex)技术(参见5.7.2节)。然而采用这种技术来满足上述约束存在以下缺点:该技术具有使互斥体的名字被其他应用程序所使用的较小的、潜在的风险。在这种情况下该技术将不再有效并且会造成很难检测到的bug。
该技术不能解决我们仅允许一个应用程序产生N个实例这种一般的问题。
幸而在System.Diagnostics.Process类中拥有GetCurrentProcess()(返回当前进程)和GetPro- cesses()(返回机器上所有的进程)这样的静态方法。在下面的程序中我们为上述问题找到了一个优雅且简单的解决方案。
static void Main()
{
if(TestIfAlreadyRunning())
{
MessageBox.Show("该程序已经打开了一个");
}
else
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new MainForm());
MainForm frm = new MainForm();
Sunisoft.IrisSkin.SkinEngine skin = new Sunisoft.IrisSkin.SkinEngine((System.ComponentModel.Component)frm);
skin.SkinFile = "DeepCyan.ssk";
skin.TitleFont = new System.Drawing.Font("微软雅黑", 9F);// 指定标题栏的Font。
Application.Run(frm);
}
}
static bool TestIfAlreadyRunning()
{
Process processCurrent = Process.GetCurrentProcess();
Process[] processes = Process.GetProcesses();
bool result = false;
foreach(Process process in processes)
{
if (processCurrent.Id != process.Id)
{
if (processCurrent.ProcessName == process.ProcessName)
{
result= true;
}
}
}
return result;
}
通过方法参数指定了远程机器的名字后,GetProcesses()方法也可以返回远程机器上所有的进程。