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