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类

【修改引荐】

  1. 如何用C#和ADO.NET拜访

  2. 浅析C# Switch句子

  3. C#验证输入办法详解

  4. 简略介绍C# 匿名办法

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