C# WinForm 判断程序是否已经在运行,且只允许运行一个实例,附源码
我们开发WinFrom程序,很多时候都希望程序只有一个实例在运行,避免运行多个同样的程序,一是没有意义,二是容易出错。
为了更便于使用,笔者整理了一段自己用的代码,可以判断程序是否在运行,只运行一个实例,而且能实现当程序在运行时,再去双击程序图标,直接呼出已经运行的程序。
下面看代码,只需在程序的入口文件中加如下代码即可:
staticclassProgram
{
///<summary>
///应用程序的主入口点。
///</summary>
[STAThread]
staticvoidMain()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//1.这里判定是否已经有实例在运行
//只运行一个实例
Processinstance=RunningInstance();
if(instance==null)
{
//1.1没有实例在运行
Application.Run(newfrmMain());
}
else
{
//1.2已经有一个实例在运行
HandleRunningInstance(instance);
}
//Application.Run(newfrmMain());
}
//2.在进程中查找是否已经有实例在运行
#region确保程序只运行一个实例
privatestaticProcessRunningInstance()
{
Processcurrent=Process.GetCurrentProcess();
Process[]processes=Process.GetProcessesByName(current.ProcessName);
//遍历与当前进程名称相同的进程列表
foreach(Processprocessinprocesses)
{
//如果实例已经存在则忽略当前进程
if(process.Id!=current.Id)
{
//保证要打开的进程同已经存在的进程来自同一文件路径
if(Assembly.GetExecutingAssembly().Location.Replace("/","\\")==current.MainModule.FileName)
{
//返回已经存在的进程
returnprocess;
}
}
}
returnnull;
}
//3.已经有了就把它激活,并将其窗口放置最前端
privatestaticvoidHandleRunningInstance(Processinstance)
{
ShowWindowAsync(instance.MainWindowHandle,1);//调用api函数,正常显示窗口
SetForegroundWindow(instance.MainWindowHandle);//将窗口放置最前端
}
[DllImport("User32.dll")]
privatestaticexternboolShowWindowAsync(System.IntPtrhWnd,intcmdShow);
[DllImport("User32.dll")]
privatestaticexternboolSetForegroundWindow(System.IntPtrhWnd);
#endregion
}