C# SingleInstance類淺析
作者:佚名 
  這里介紹C# SingleInstance類實現(xiàn)只允許一個實例運行,Program為測試主程序入口,在代碼中標識說明文字。 
 本文是針對《基于.Net平臺應(yīng)用程序唯一運行實例實現(xiàn)》的補充,文章給出功能實現(xiàn)代碼,其中C# SingleInstance類實現(xiàn)只允許一個實例運行,Program為測試主程序入口。在代碼中標識說明文字。 
 C# SingleInstance類代碼:
- usingSystem;
 - usingSystem.IO;
 - usingSystem.Diagnostics;
 - usingSystem.Threading;
 - usingSystem.Reflection;
 - usingSystem.Runtime.InteropServices;
 - namespaceZhengzuo.CSharpCode
 - {
 - ///<summary>
 - ///只啟動一個應(yīng)用程序?qū)嵗刂祁?
 - ///</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實現(xiàn)
 - ///<summary>
 - ///獲取應(yīng)用程序進程實例,如果沒有匹配進程,返回Null
 - ///</summary>
 - ///<returns>返回當(dāng)前Process實例</returns>
 - publicstaticProcessGetRunningInstance()
 - {
 - ProcessProcesscurrentProcess=Process.GetCurrentProcess();//獲取當(dāng)前進程
 - //獲取當(dāng)前運行程序完全限定名
 - stringcurrentFileName=currentProcess.MainModule.FileName;
 - //獲取進程名為ProcessName的Process數(shù)組。
 - Process[]processes=Process.GetProcessesByName(currentProcess.ProcessName);
 - //遍歷有相同進程名稱正在運行的進程
 - foreach(Processprocessinprocesses)
 - {
 - if(process.MainModule.FileName==currentFileName)
 - {
 - if(process.Id!=currentProcess.Id)//根據(jù)進程ID排除當(dāng)前進程
 - returnprocess;//返回已運行的進程實例
 - }
 - }
 - returnnull;
 - }
 - ///<summary>
 - ///獲取應(yīng)用程序句柄,設(shè)置應(yīng)用程序前臺運行,并返回bool值
 - ///</summary>
 - publicstaticboolHandleRunningInstance(Processinstance)
 - {
 - //確保窗口沒有被最小化或最大化
 - ShowWindowAsync(instance.MainWindowHandle,WS_SHOWNORMAL);
 - //設(shè)置真實例程為foregroundwindow
 - returnSetForegroundWindow(instance.MainWindowHandle);
 - }
 - ///<summary>
 - ///獲取窗口句柄,設(shè)置應(yīng)用程序前臺運行,并返回bool值,重載方法
 - ///</summary>
 - ///<returns></returns>
 - publicstaticboolHandleRunningInstance()
 - {
 - Processp=GetRunningInstance();
 - if(p!=null)
 - {
 - HandleRunningInstance(p);
 - returntrue;
 - }
 - returnfalse;
 - }
 - #endregion
 - #regionMutex實現(xiàn)
 - ///<summary>
 - ///創(chuàng)建應(yīng)用程序進程Mutex
 - ///</summary>
 - ///<returns>返回創(chuàng)建結(jié)果,true表示創(chuàng)建成功,false創(chuàng)建失敗。</returns>
 - publicstaticboolCreateMutex()
 - {
 - returnCreateMutex(Assembly.GetEntryAssembly().FullName);
 - }
 - ///<summary>
 - ///創(chuàng)建應(yīng)用程序進程Mutex
 - ///</summary>
 - ///<paramnameparamname="name">Mutex名稱</param>
 - ///<returns>返回創(chuàng)建結(jié)果,true表示創(chuàng)建成功,false創(chuàng)建失敗。</returns>
 - publicstaticboolCreateMutex(stringname)
 - {
 - boolresult=false;
 - mutex=newMutex(true,name,outresult);
 - returnresult;
 - }
 - ///<summary>
 - ///釋放Mutex
 - ///</summary>
 - publicstaticvoidReleaseMutex()
 - {
 - if(mutex!=null)
 - {
 - mutex.Close();
 - }
 - }
 - #endregion
 - #region設(shè)置標志實現(xiàn)
 - ///<summary>
 - ///初始化程序運行標志,如果設(shè)置成功,返回true,已經(jīng)設(shè)置返回false,設(shè)置失敗將拋出異常
 - ///</summary>
 - ///<returns>返回設(shè)置結(jié)果</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類
【編輯推薦】
責(zé)任編輯:佚名 
                    來源:
                    天極網(wǎng)
 














 
 
 
 
 
 
 