C#中查找或结束程序域中的主、子进程

有时候,咱们的程序须要启动一些子进程,如嵌入的图形程序。数组

当启动一个进程后,得到这个进程信息Process,而后其内部在某个时刻启动了一个子进程,这个时候就涉及程序域和进程树的概念。当咱们经过非正常操做的方式结束前面得到的进程信息Process时(如Kill掉),可能并无实际结束子进程。由于当有主进程启动了子进程后,全部的进程其实是被放在程序域中运行的(winform的Program文件中的Application域中),而结束的仅仅是域中的某个进程。固然,若是咱们正常推出主进程,实际上Application在推出时,作了不少操做,以结束整个域中的信息;若是采用捕捉的Process结束,Application并无彻底执行退出(使用Application的Exit事件,能够检验)。spa

若是要彻底退出相关进程,就须要查找主进程下的全部子进程,并结束全部进程:code

 /// <summary>
 /// 结束进程和相关的子进程
 /// </summary>
 /// <param name="pid">须要结束的进程ID</param>
 public static void KillProcessAndChildren(int pid)
 {
     ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Process Where ParentProcessID=" + pid);
     ManagementObjectCollection moc = searcher.Get();
     foreach (ManagementObject mo in moc)
     {
         KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
     }
     try
     {
         Process proc = Process.GetProcessById(pid);
         Console.WriteLine(pid);
         proc.Kill();
     }
     catch (ArgumentException)
     {
         /* process already exited */
     }
 }

查找进程ID的方法:orm

//1.根据进程id,得到进程
Process p = Process.GetProcessById(100);
//2.获取当前进程
Process p = Process.GetCurrentProcess();
//3.根据进程名字获取进程,返回的结果是一个数组
Process p = (Process.GetProcessesByName("DriverEasy"))[0];

其中,以上代码须要先引入System.Management.dll(在Framework中找到相关引用);再引入命令空间:System.Management;blog

相关文章
相关标签/搜索