本文是针对《基于.Net平台应用程序唯一运行实例实现》的补充,文章给出功能实现代码,其中C# SingleInstance类实现只允许一个实例运行,Program为测试主程序入口。在代码中标识说明文字。
C# SingleInstance类代码:
- usingSystem;
- usingSystem.IO;
- usingSystem.Diagnostics;
- usingSystem.Threading;
- usingSystem.Reflection;
- usingSystem.Runtime.InteropServices;
- namespaceZhengzuo.CSharpCode
- {
- ///
- ///只启动一个应用程序实例控制类
- ///
- publicstaticclassSingleInstance
- {
- privateconstintWS_SHOWNORMAL=1;
- [DllImport("User32.dll")]
- privatestaticexternboolShowWindowAsync(IntPtrhWnd,intcmdShow);
- [DllImport("User32.dll")]
- privatestaticexternboolSetForegroundWindow(IntPtrhWnd);
- //标志文件名称
- privatestaticstringrunFlagFullname=null;
- //声明同步基元
- privatestaticMutexmutex=null;
- ///
- ///staticConstructor
- ///
- staticSingleInstance()
- {
- }
- #regionapi实现
- ///
- ///获取应用程序进程实例,如果没有匹配进程,返回Null
- ///
- ///
返回当前Process实例 - 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;
- }
- ///
- ///获取应用程序句柄,设置应用程序前台运行,并返回bool值
- ///
- publicstaticboolHandleRunningInstance(Processinstance)
- {
- //确保窗口没有被最小化或最大化
- ShowWindowAsync(instance.MainWindowHandle,WS_SHOWNORMAL);
- //设置真实例程为foregroundwindow
- returnSetForegroundWindow(instance.MainWindowHandle);
- }
- ///
- ///获取窗口句柄,设置应用程序前台运行,并返回bool值,重载方法
- ///
- ///
- publicstaticboolHandleRunningInstance()
- {
- Processp=GetRunningInstance();
- if(p!=null)
- {
- HandleRunningInstance(p);
- returntrue;
- }
- returnfalse;
- }
- #endregion
- #regionMutex实现
- ///
- ///创建应用程序进程Mutex
- ///
- ///
返回创建结果,true表示创建成功,false创建失败。 - publicstaticboolCreateMutex()
- {
- returnCreateMutex(Assembly.GetEntryAssembly().FullName);
- }
- ///
- ///创建应用程序进程Mutex
- ///
- ///<paramnameparamname="name">Mutex名称
- ///
返回创建结果,true表示创建成功,false创建失败。 - publicstaticboolCreateMutex(stringname)
- {
- boolresult=false;
- mutex=newMutex(true,name,outresult);
- returnresult;
- }
- ///
- ///释放Mutex
- ///
- publicstaticvoidReleaseMutex()
- {
- if(mutex!=null)
- {
- mutex.Close();
- }
- }
- #endregion
- #region设置标志实现
- ///
- ///初始化程序运行标志,如果设置成功,返回true,已经设置返回false,设置失败将抛出异常
- ///
- ///
返回设置结果 - publicstaticboolInitRunFlag()
- {
- if(File.Exists(RunFlag))
- {
- returnfalse;
- }
- using(FileStreamfs=newFileStream(RunFlag,FileMode.Create))
- {
- }
- returntrue;
- }
- ///
- ///释放初始化程序运行标志,如果释放失败将抛出异常
- ///
- publicstaticvoidDisposeRunFlag()
- {
- if(File.Exists(RunFlag))
- {
- File.Delete(RunFlag);
- }
- }
以上介绍C# SingleInstance类
本文名称:C#SingleInstance类浅析
链接分享:http://www.shufengxianlan.com/qtweb/news25/450625.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联