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; //下面写正常的启动逻辑 }