C#SingleInstance类浅析

本文是针对《基于.Net平台应用程序唯一运行实例实现》的补充,文章给出功能实现代码,其中C# SingleInstance类实现只允许一个实例运行,Program为测试主程序入口。在代码中标识说明文字。

C# SingleInstance类代码:

 
 
 
  1. usingSystem;
  2. usingSystem.IO;
  3. usingSystem.Diagnostics;
  4. usingSystem.Threading;
  5. usingSystem.Reflection;
  6. usingSystem.Runtime.InteropServices;
  7. namespaceZhengzuo.CSharpCode
  8. {
  9. ///
  10. ///只启动一个应用程序实例控制类
  11. ///
  12. publicstaticclassSingleInstance
  13. {
  14. privateconstintWS_SHOWNORMAL=1;
  15. [DllImport("User32.dll")]
  16. privatestaticexternboolShowWindowAsync(IntPtrhWnd,intcmdShow);
  17. [DllImport("User32.dll")]
  18. privatestaticexternboolSetForegroundWindow(IntPtrhWnd);
  19. //标志文件名称
  20. privatestaticstringrunFlagFullname=null;
  21. //声明同步基元
  22. privatestaticMutexmutex=null;
  23. ///
  24. ///staticConstructor
  25. ///
  26. staticSingleInstance()
  27. {
  28. }
  29. #regionapi实现
  30. ///
  31. ///获取应用程序进程实例,如果没有匹配进程,返回Null
  32. ///
  33. ///返回当前Process实例
  34. publicstaticProcessGetRunningInstance()
  35. {
  36. ProcessProcesscurrentProcess=Process.GetCurrentProcess();//获取当前进程
  37. //获取当前运行程序完全限定名
  38. stringcurrentFileName=currentProcess.MainModule.FileName;
  39. //获取进程名为ProcessName的Process数组。
  40. Process[]processes=Process.GetProcessesByName(currentProcess.ProcessName);
  41. //遍历有相同进程名称正在运行的进程
  42. foreach(Processprocessinprocesses)
  43. {
  44. if(process.MainModule.FileName==currentFileName)
  45. {
  46. if(process.Id!=currentProcess.Id)//根据进程ID排除当前进程
  47. returnprocess;//返回已运行的进程实例
  48. }
  49. }
  50. returnnull;
  51. }
  52. ///
  53. ///获取应用程序句柄,设置应用程序前台运行,并返回bool值
  54. ///
  55. publicstaticboolHandleRunningInstance(Processinstance)
  56. {
  57. //确保窗口没有被最小化或最大化
  58. ShowWindowAsync(instance.MainWindowHandle,WS_SHOWNORMAL);
  59. //设置真实例程为foregroundwindow
  60. returnSetForegroundWindow(instance.MainWindowHandle);
  61. }
  62. ///
  63. ///获取窗口句柄,设置应用程序前台运行,并返回bool值,重载方法
  64. ///
  65. ///
  66. publicstaticboolHandleRunningInstance()
  67. {
  68. Processp=GetRunningInstance();
  69. if(p!=null)
  70. {
  71. HandleRunningInstance(p);
  72. returntrue;
  73. }
  74. returnfalse;
  75. }
  76. #endregion
  77. #regionMutex实现
  78. ///
  79. ///创建应用程序进程Mutex
  80. ///
  81. ///返回创建结果,true表示创建成功,false创建失败。
  82. publicstaticboolCreateMutex()
  83. {
  84. returnCreateMutex(Assembly.GetEntryAssembly().FullName);
  85. }
  86. ///
  87. ///创建应用程序进程Mutex
  88. ///
  89. ///<paramnameparamname="name">Mutex名称
  90. ///返回创建结果,true表示创建成功,false创建失败。
  91. publicstaticboolCreateMutex(stringname)
  92. {
  93. boolresult=false;
  94. mutex=newMutex(true,name,outresult);
  95. returnresult;
  96. }
  97. ///
  98. ///释放Mutex
  99. ///
  100. publicstaticvoidReleaseMutex()
  101. {
  102. if(mutex!=null)
  103. {
  104. mutex.Close();
  105. }
  106. }
  107. #endregion
  108. #region设置标志实现
  109. ///
  110. ///初始化程序运行标志,如果设置成功,返回true,已经设置返回false,设置失败将抛出异常
  111. ///
  112. ///返回设置结果
  113. publicstaticboolInitRunFlag()
  114. {
  115. if(File.Exists(RunFlag))
  116. {
  117. returnfalse;
  118. }
  119. using(FileStreamfs=newFileStream(RunFlag,FileMode.Create))
  120. {
  121. }
  122. returntrue;
  123. }
  124. ///
  125. ///释放初始化程序运行标志,如果释放失败将抛出异常
  126. ///
  127. publicstaticvoidDisposeRunFlag()
  128. {
  129. if(File.Exists(RunFlag))
  130. {
  131. File.Delete(RunFlag);
  132. }
  133. }

以上介绍C# SingleInstance类

本文名称:C#SingleInstance类浅析
链接分享:http://www.shufengxianlan.com/qtweb/news25/450625.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联