C#,结束进程树

啥也不用解释说明,直接拷贝源码即可用,搜了好久才找到的,激动万分!!

  1  using  System;
  2  using  System.Collections.Generic;
  3  using  System.Text;
  4 
  5  using  System.Collections;
  6  using  System.Diagnostics;
  7  using  System.Runtime.InteropServices;
  8  ///   <summary>  
  9  ///  Summary description for ProcessTreeKillable. 
 10  ///   </summary>  
 11  public   class  ProcessUtility
 12  {
 13       public   static   void  KillTree( int  processToKillId)
 14      {
 15           //  Kill each child process 
 16           foreach  ( int  childProcessId  in  GetChildProcessIds(processToKillId))
 17          {
 18               using  (Process child  =  Process.GetProcessById(childProcessId))
 19              {
 20                  child.Kill();
 21 
 22              }
 23 
 24          }
 25 
 26           //  Then kill this process 
 27           using  (Process thisProcess  =  Process.GetProcessById(processToKillId))
 28          {
 29              thisProcess.Kill();
 30 
 31          }
 32 
 33      }
 34 
 35       public   static   int  GetParentProcessId( int  processId)
 36      {
 37           int  ParentID  =   0 ;
 38           int  hProcess  =  OpenProcess(eDesiredAccess.PROCESS_QUERY_INFORMATION,
 39           false , processId);
 40           if  (hProcess  !=   0 )
 41          {
 42               try
 43              {
 44                  PROCESS_BASIC_INFORMATION pbi  =   new  PROCESS_BASIC_INFORMATION();
 45                   int  pSize  =   0 ;
 46                   if  ( - 1   !=  NtQueryInformationProcess(hProcess,
 47                  PROCESSINFOCLASS.ProcessBasicInformation,  ref  pbi, pbi.Size,  ref
 48                  pSize))
 49                  {
 50                      ParentID  =  pbi.InheritedFromUniqueProcessId;
 51 
 52                  }
 53 
 54              }
 55 
 56               finally
 57              {
 58                  CloseHandle(hProcess);
 59 
 60              }
 61 
 62          }
 63 
 64           return  (ParentID);
 65 
 66      }
 67 
 68       public   static   int [] GetChildProcessIds( int  parentProcessId)
 69      {
 70          ArrayList myChildren  =   new  ArrayList();
 71           foreach  (Process proc  in  Process.GetProcesses())
 72          {
 73               int  currentProcessId  =  proc.Id;
 74              proc.Dispose();
 75               if  (parentProcessId  ==  GetParentProcessId(currentProcessId))
 76              {
 77                   //  Add this one 
 78                  myChildren.Add(currentProcessId);
 79                   //  Add any of its children 
 80                  myChildren.AddRange(GetChildProcessIds(currentProcessId));
 81 
 82              }
 83 
 84          }
 85 
 86           return  ( int [])myChildren.ToArray( typeof ( int ));
 87 
 88      }
 89 
 90       #region  PInvokes
 91      [DllImport( " KERNEL32.DLL " )]
 92       private   static   extern   int  OpenProcess(eDesiredAccess dwDesiredAccess,
 93       bool  bInheritHandle,  int  dwProcessId);
 94      [DllImport( " KERNEL32.DLL " )]
 95       private   static   extern   int  CloseHandle( int  hObject);
 96      [DllImport( " NTDLL.DLL " )]
 97       private   static   extern   int  NtQueryInformationProcess( int  hProcess,
 98      PROCESSINFOCLASS pic,  ref  PROCESS_BASIC_INFORMATION pbi,  int  cb,  ref
 99       int  pSize);
100       private   enum  PROCESSINFOCLASS :  int
101      {
102          ProcessBasicInformation  =   0 ,
103          ProcessQuotaLimits,
104          ProcessIoCounters,
105          ProcessVmCounters,
106          ProcessTimes,
107          ProcessBasePriority,
108          ProcessRaisePriority,
109          ProcessDebugPort,
110          ProcessExceptionPort,
111          ProcessAccessToken,
112          ProcessLdtInformation,
113          ProcessLdtSize,
114          ProcessDefaultHardErrorMode,
115          ProcessIoPortHandlers,
116           //  Note: this is kernel mode only 
117          ProcessPooledUsageAndLimits,
118          ProcessWorkingSetWatch,
119          ProcessUserModeIOPL,
120          ProcessEnableAlignmentFaultFixup,
121          ProcessPriorityClass,
122          ProcessWx86Information,
123          ProcessHandleCount,
124          ProcessAffinityMask,
125          ProcessPriorityBoost,
126          MaxProcessInfoClass
127 
128      };
129 
130      [StructLayout(LayoutKind.Sequential)]
131       private   struct  PROCESS_BASIC_INFORMATION
132      {
133           public   int  ExitStatus;
134           public   int  PebBaseAddress;
135           public   int  AffinityMask;
136           public   int  BasePriority;
137           public   int  UniqueProcessId;
138           public   int  InheritedFromUniqueProcessId;
139           public   int  Size
140          {
141               get
142              {
143                   return  ( 6   *   4 );
144              }
145 
146          }
147 
148      };
149 
150       private   enum  eDesiredAccess :  int
151      {
152          DELETE  =   0x00010000 ,
153          READ_CONTROL  =   0x00020000 ,
154          WRITE_DAC  =   0x00040000 ,
155          WRITE_OWNER  =   0x00080000 ,
156          SYNCHRONIZE  =   0x00100000 ,
157          STANDARD_RIGHTS_ALL  =   0x001F0000 ,
158          PROCESS_TERMINATE  =   0x0001 ,
159          PROCESS_CREATE_THREAD  =   0x0002 ,
160          PROCESS_SET_SESSIONID  =   0x0004 ,
161          PROCESS_VM_OPERATION  =   0x0008 ,
162          PROCESS_VM_READ  =   0x0010 ,
163          PROCESS_VM_WRITE  =   0x0020 ,
164          PROCESS_DUP_HANDLE  =   0x0040 ,
165          PROCESS_CREATE_PROCESS  =   0x0080 ,
166          PROCESS_SET_QUOTA  =   0x0100 ,
167          PROCESS_SET_INFORMATION  =   0x0200 ,
168          PROCESS_QUERY_INFORMATION  =   0x0400 ,
169          PROCESS_ALL_ACCESS  =  SYNCHRONIZE  |   0xFFF
170 
171      }
172       #endregion
173 
174  }

 

原链接地址(翻墙可阅):http://groups.google.com/group/microsoft.public.dotnet.framework/browse_thread/thread/4f8384daf8eba9c4/?pli=1 

转载于:https://www.cnblogs.com/yimu/archive/2010/12/26/FXXDL_QDYF.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值