c# windows应用程序只启动一次 SingleInstance类
更新时间:2022-12-26 作者:开发学习网
这里介绍C# SingleInstance类实现只允许一个实例运行,Program为测试主程序入口,在代码中标识说明文字。
本文是针对《依据.Net渠道应用程序仅有运转实例完成》的弥补,文章给出功用完成代码,其间C# SingleInstance类完成只允许一个实例运转,Program为测验主程序进口。在代码中标识阐明文字。
C# SingleInstance类代码:
usingSystem;
usingSystem.IO;
usingSystem.Diagnostics;
usingSystem.Threading;
usingSystem.Reflection;
usingSystem.Runtime.InteropServices;
namespaceZhengzuo.CSharpCode
{
///<summary>
///只发动一个应用程序实例操控类
///</summary>
publicstaticclassSingleInstance
{
privateconstintWS_SHOWNORMAL=1;
[DllImport("User32.dll")]
privatestaticexternboolShowWindowAsync(IntPtrhWnd,intcmdShow);
[DllImport("User32.dll")]
privatestaticexternboolSetForegroundWindow(IntPtrhWnd);
//标志文件称号
privatestaticstringrunFlagFullname=null;
//声明同步基元
privatestaticMutexmutex=null;
///<summary>
///staticConstructor
///</summary>
staticSingleInstance()
{
}
#regionapi完成
///<summary>
///获取应用程序进程实例,假如没有匹配进程,回来Null
///</summary>
///<returns>回来当时Process实例</returns>
publicstaticProcessGetRunningInstance()
{
ProcessProcesscurrentProcess=Process.GetCurrentProcess();//获取当时进程
//获取当时运转程序彻底限定名
stringcurrentFileName=currentProcess.MainModule.FileName;
//获取进程名为ProcessName的Process数组。
Process[]processes=Process.GetProcessesByName(currentProcess.ProcessName);
//遍历有相同进程称号正在运转的进程
foreach(Processprocessinprocesses)
{
if(process.MainModule.FileName==currentFileName)
{
if(process.Id!=currentProcess.Id)//依据进程ID扫除当时进程
returnprocess;//回来已运转的进程实例
}
}
returnnull;
}
///<summary>
///获取应用程序句柄,设置应用程序前台运转,并回来bool值
///</summary>
publicstaticboolHandleRunningInstance(Processinstance)
{
//保证窗口没有被最小化或最大化
ShowWindowAsync(instance.MainWindowHandle,WS_SHOWNORMAL);
//设置实在例程为foregroundwindow
returnSetForegroundWindow(instance.MainWindowHandle);
}
///<summary>
///获取窗口句柄,设置应用程序前台运转,并回来bool值,重载办法
///</summary>
///<returns></returns>
publicstaticboolHandleRunningInstance()
{
Processp=GetRunningInstance();
if(p!=null)
{
HandleRunningInstance(p);
returntrue;
}
returnfalse;
}
#endregion
#regionMutex完成
///<summary>
///创立应用程序进程Mutex
///</summary>
///<returns>回来创立成果,true表明创立成功,false创立失利。</returns>
publicstaticboolCreateMutex()
{
returnCreateMutex(Assembly.GetEntryAssembly().FullName);
}
///<summary>
///创立应用程序进程Mutex
///</summary>
///<paramnameparamname="name">Mutex称号</param>
///<returns>回来创立成果,true表明创立成功,false创立失利。</returns>
publicstaticboolCreateMutex(stringname)
{
boolresult=false;
mutex=newMutex(true,name,outresult);
returnresult;
}
///<summary>
///开释Mutex
///</summary>
publicstaticvoidReleaseMutex()
{
if(mutex!=null)
{
mutex.Close();
}
}
#endregion
#region设置标志完成
///<summary>
///初始化程序运转标志,假如设置成功,回来true,现已设置回来false,设置失利将抛出反常
///</summary>
///<returns>回来设置成果</returns>
publicstaticboolInitRunFlag()
{
if(File.Exists(RunFlag))
{
returnfalse;
}
using(FileStreamfs=newFileStream(RunFlag,FileMode.Create))
{
}
returntrue;
}
///<summary>
///开释初始化程序运转标志,假如开释失利将抛出反常
///</summary>
publicstaticvoidDisposeRunFlag()
{
if(File.Exists(RunFlag))
{
File.Delete(RunFlag);
}
}以上介绍C# SingleInstance类
【修改引荐】
如何用C#和ADO.NET拜访
浅析C# Switch句子
C#验证输入办法详解
简略介绍C# 匿名办法
C# FileSystemWatcher目标
#region class SingleInstance
static class SingleInstance
{
private static Mutex mutex = null;
public static bool CreateMutex()
{
return CreateMutex(Assembly.GetEntryAssembly().FullName);
}
public static bool CreateMutex(string name)
{
bool result = false;
mutex = new Mutex(true, name, out result);
return result;
}
public static void ReleaseMutex()
{
if (mutex != null)
{
mutex.Close();
}
}
}
#endregion
[STAThread]
static void Main()
{
//返回Ture 说明有程序正在运行 推出程序启动
if (!SingleInstance.CreateMutex())
return;
//下面写正常的启动逻辑
}
