ProcessTool.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. //************************************************************************
  2. // author: yuzhengyang
  3. // date: 2017.10.12 - 2018.5.28
  4. // desc: 进程工具
  5. // Copyright (c) yuzhengyang. All rights reserved.
  6. //************************************************************************
  7. using Azylee.Core.DataUtils.CollectionUtils;
  8. using Azylee.Core.ThreadUtils.SleepUtils;
  9. using System;
  10. using System.Diagnostics;
  11. using System.IO;
  12. using System.Threading.Tasks;
  13. namespace Azylee.Core.ProcessUtils
  14. {
  15. public static class ProcessTool
  16. {
  17. /// <summary>
  18. /// 判断进程是否存在
  19. /// </summary>
  20. /// <param name="name">进程名</param>
  21. /// <returns></returns>
  22. public static bool IsExists(string name)
  23. {
  24. try
  25. {
  26. var p = Process.GetProcessesByName(name);
  27. if (ListTool.HasElements(p)) return true;
  28. }
  29. catch { }
  30. return false;
  31. }
  32. /// <summary>
  33. /// 启动程序
  34. /// </summary>
  35. /// <param name="file">文件路径</param>
  36. /// <param name="args">启动参数</param>
  37. /// <returns></returns>
  38. public static bool Start(string file, string args = "")
  39. {
  40. if (File.Exists(file))
  41. {
  42. try
  43. {
  44. Process.Start(file, args);
  45. return true;
  46. }
  47. catch { }
  48. }
  49. return false;
  50. }
  51. /// <summary>
  52. /// 启动进程(定制启动配置)
  53. /// </summary>
  54. /// <param name="args"></param>
  55. public static bool StartCustom(string file, string args = "")
  56. {
  57. try
  58. {
  59. if (File.Exists(file))
  60. {
  61. Process p = new Process();
  62. p.StartInfo.FileName = file;
  63. p.StartInfo.Arguments = args;
  64. p.StartInfo.UseShellExecute = true;
  65. p.Start();
  66. p.WaitForInputIdle(3000);
  67. return true;
  68. }
  69. }
  70. catch (Exception ex) { }
  71. return false;
  72. }
  73. /// <summary>
  74. /// 停止进程
  75. /// </summary>
  76. /// <param name="name">进程名</param>
  77. public static void Kill(string name)
  78. {
  79. try
  80. {
  81. Process[] processes = Process.GetProcessesByName(name);
  82. foreach (Process p in processes)
  83. {
  84. try
  85. {
  86. p.Kill();
  87. p.Close();
  88. }
  89. catch { }
  90. }
  91. }
  92. catch (Exception e) { }
  93. }
  94. /// <summary>
  95. /// 停止当前进程
  96. /// </summary>
  97. public static void KillCurrent()
  98. {
  99. try
  100. {
  101. Process current = Process.GetCurrentProcess();
  102. current.Kill();
  103. }
  104. catch { }
  105. }
  106. /// <summary>
  107. /// 停止多个进程
  108. /// </summary>
  109. /// <param name="names"></param>
  110. public static void Kills(string[] names)
  111. {
  112. if (ListTool.HasElements(names))
  113. {
  114. foreach (var name in names)
  115. {
  116. if (!string.IsNullOrWhiteSpace(name))
  117. Kill(name);
  118. }
  119. }
  120. }
  121. /// <summary>
  122. /// 停止超时进程
  123. /// </summary>
  124. /// <param name="name">进程名(不含后缀)</param>
  125. /// <param name="file">文件路径(为空则不验证)</param>
  126. /// <param name="second">超时时间(单位:秒)</param>
  127. public static void Kills(string name, string file, int second)
  128. {
  129. try
  130. {
  131. Process[] list = Process.GetProcessesByName(name);
  132. if (ListTool.HasElements(list))
  133. {
  134. DateTime time = DateTime.Now.AddSeconds(-1 * second);
  135. foreach (var p in list)
  136. {
  137. if (file == null || p.MainModule.FileName == file)
  138. if (p.StartTime < time)
  139. try { p.Kill(); } catch { }
  140. }
  141. }
  142. }
  143. catch { }
  144. }
  145. /// <summary>
  146. /// 强制关闭超时进程
  147. /// </summary>
  148. /// <param name="process"></param>
  149. /// <param name="second"></param>
  150. public static void Kill(Process process, int second)
  151. {
  152. DateTime time = DateTime.Now.AddSeconds(-1 * second);
  153. if (process.StartTime < time)
  154. try { process.Kill(); } catch { }
  155. }
  156. /// <summary>
  157. /// 延时并关闭进程
  158. /// </summary>
  159. /// <param name="process"></param>
  160. /// <param name="second"></param>
  161. public static void SleepKill(Process process, short second)
  162. {
  163. Task.Factory.StartNew(() =>
  164. {
  165. Sleep.S(second);
  166. try { process?.Kill(); } catch { }
  167. });
  168. }
  169. /// <summary>
  170. /// 根据PID获取InstanceName(不要用于性能计数器,#1..实例名会自动改变)
  171. /// </summary>
  172. /// <param name="id"></param>
  173. /// <returns></returns>
  174. public static string GetInstanceNameById(int id)
  175. {
  176. try
  177. {
  178. PerformanceCounterCategory cat = new PerformanceCounterCategory("Process");
  179. string[] instances = cat.GetInstanceNames();
  180. foreach (string instance in instances)
  181. {
  182. try
  183. {
  184. using (PerformanceCounter cnt = new PerformanceCounter("Process", "ID Process", instance, true))
  185. {
  186. int val = (int)cnt.RawValue;
  187. if (val == id)
  188. {
  189. return instance;
  190. }
  191. }
  192. }
  193. catch { }
  194. }
  195. }
  196. catch { }
  197. return null;
  198. }
  199. }
  200. }