ProcessTool.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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. try
  41. {
  42. Process.Start(file, args);
  43. return true;
  44. }
  45. catch { }
  46. return false;
  47. }
  48. /// <summary>
  49. /// 启动进程(定制启动配置)
  50. /// </summary>
  51. /// <param name="args"></param>
  52. public static bool StartCustom(string file, string args = "")
  53. {
  54. try
  55. {
  56. Process p = new Process();
  57. p.StartInfo.FileName = file;
  58. p.StartInfo.Arguments = args;
  59. p.StartInfo.UseShellExecute = true;
  60. p.Start();
  61. p.WaitForInputIdle(3000);
  62. return true;
  63. }
  64. catch (Exception ex) { }
  65. return false;
  66. }
  67. /// <summary>
  68. /// 停止进程
  69. /// </summary>
  70. /// <param name="name">进程名</param>
  71. public static void Kill(string name)
  72. {
  73. try
  74. {
  75. Process[] processes = Process.GetProcessesByName(name);
  76. foreach (Process p in processes)
  77. {
  78. try
  79. {
  80. p.Kill();
  81. p.Close();
  82. }
  83. catch { }
  84. }
  85. }
  86. catch (Exception e) { }
  87. }
  88. /// <summary>
  89. /// 停止当前进程
  90. /// </summary>
  91. public static void KillCurrent()
  92. {
  93. try
  94. {
  95. Process current = Process.GetCurrentProcess();
  96. current.Kill();
  97. }
  98. catch { }
  99. }
  100. /// <summary>
  101. /// 停止多个进程
  102. /// </summary>
  103. /// <param name="names"></param>
  104. public static void Kills(string[] names)
  105. {
  106. if (ListTool.HasElements(names))
  107. {
  108. foreach (var name in names)
  109. {
  110. if (!string.IsNullOrWhiteSpace(name))
  111. Kill(name);
  112. }
  113. }
  114. }
  115. /// <summary>
  116. /// 停止超时进程
  117. /// </summary>
  118. /// <param name="name">进程名(不含后缀)</param>
  119. /// <param name="file">文件路径(为空则不验证)</param>
  120. /// <param name="second">超时时间(单位:秒)</param>
  121. public static void Kills(string name, string file, int second)
  122. {
  123. try
  124. {
  125. Process[] list = Process.GetProcessesByName(name);
  126. if (ListTool.HasElements(list))
  127. {
  128. DateTime time = DateTime.Now.AddSeconds(-1 * second);
  129. foreach (var p in list)
  130. {
  131. if (file == null || p.MainModule.FileName == file)
  132. if (p.StartTime < time)
  133. try { p.Kill(); } catch { }
  134. }
  135. }
  136. }
  137. catch { }
  138. }
  139. /// <summary>
  140. /// 强制关闭超时进程
  141. /// </summary>
  142. /// <param name="process"></param>
  143. /// <param name="second"></param>
  144. public static void Kill(Process process, int second)
  145. {
  146. DateTime time = DateTime.Now.AddSeconds(-1 * second);
  147. if (process.StartTime < time)
  148. try { process.Kill(); } catch { }
  149. }
  150. /// <summary>
  151. /// 延时并关闭进程
  152. /// </summary>
  153. /// <param name="process"></param>
  154. /// <param name="second"></param>
  155. public static void SleepKill(Process process, short second)
  156. {
  157. Task.Factory.StartNew(() =>
  158. {
  159. Sleep.S(second);
  160. try { process?.Kill(); } catch { }
  161. });
  162. }
  163. /// <summary>
  164. /// 根据PID获取InstanceName(不要用于性能计数器,#1..实例名会自动改变)
  165. /// </summary>
  166. /// <param name="id"></param>
  167. /// <returns></returns>
  168. public static string GetInstanceNameById(int id)
  169. {
  170. try
  171. {
  172. PerformanceCounterCategory cat = new PerformanceCounterCategory("Process");
  173. string[] instances = cat.GetInstanceNames();
  174. foreach (string instance in instances)
  175. {
  176. try
  177. {
  178. using (PerformanceCounter cnt = new PerformanceCounter("Process", "ID Process", instance, true))
  179. {
  180. int val = (int)cnt.RawValue;
  181. if (val == id)
  182. {
  183. return instance;
  184. }
  185. }
  186. }
  187. catch { }
  188. }
  189. }
  190. catch { }
  191. return null;
  192. }
  193. }
  194. }