C# SingleInstance类浅析

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

以上介绍C# SingleInstance类

【编辑推荐】

  1. 如何用C#和ADO.NET访问
  2. 浅析C# Switch语句
  3. C#验证输入方法详解
  4. 简单介绍C# 匿名方法
  5. C# FileSystemWatcher对象
责任编辑:佚名 来源: 天极网
相关推荐

2009-08-21 17:24:06

C# SingleIn

2009-08-06 14:43:10

C# Calculat

2009-08-27 16:18:47

C#类C#结构体

2009-08-20 11:07:07

C#共享内存

2009-08-17 18:34:50

C# ChangeCo

2009-08-14 17:45:52

C# ArrayLis

2009-08-13 14:06:37

C#结构体结构体和类的区别

2009-08-12 16:46:22

C#读取XML文档

2009-08-25 17:59:49

C#入门

2009-08-07 17:25:37

C# SortedLi

2009-07-30 18:36:00

C#接口C#抽象类

2009-08-20 15:10:33

C#正则表达式

2009-08-20 15:02:41

C#正则表达式

2009-08-20 14:57:00

C#正则表达式

2009-08-20 15:06:51

C#正则表达式

2009-08-04 09:30:33

C#调用ImageAn

2009-08-20 10:10:55

C#透明窗体

2009-08-10 14:43:03

C#函数Convert

2009-08-12 17:03:39

C# Static修饰

2009-08-11 14:45:41

C# DataGrid
点赞
收藏

51CTO技术栈公众号