2013-03-26 60 views
1

我想列出给定进程的所有子代(因为它是进程ID)。 经过一番研究,我得出这样的:列出进程的所有子代

static void Main(string[] args) 
{ 
    listChildProcesses(0); 
    Console.ReadKey(); 
} 

public static void listChildProcesses(int parentProcessId) 
{ 
    String myQuery = string.Format("select * from win32_process where ParentProcessId={0}", parentProcessId); 
    ObjectQuery objQuery = new ObjectQuery(myQuery); 
    ManagementObjectSearcher objSearcher = new ManagementObjectSearcher(objQuery); 
    ManagementObjectCollection processList = objSearcher.Get(); 

    foreach (ManagementObject item in processList) 
    { 
     try 
     { 
      int processId = Convert.ToInt32(item["ProcessId"].ToString()); 

      Console.WriteLine("processId:{0} name:{1} {2}", 
       item["ProcessId"], 
       item["Name"], 
       item["ParentProcessId"] 
      ); 

      // recursive call 
      if (processId != parentProcessId) 
       listChildProcesses(processId); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Error: " + e); 
     } 
    } 
} 

我希望这可以让我来显示所有的进程(因为该方法开始于PID = 0,然后被递归调用每个PID从那里找到)。

但这里是输出我得到在我的Windows 8(86):

processId:0 name:System Idle Process 0 
processId:4 name:System 0 
processId:300 name:smss.exe 4 

它停在那里。我希望它继续与系统的每个孩子,然后是这些孩子的每个孩子。

+0

[我如何获得C#中给定服务的子进程列表?](http://stackoverflow.com/questions/1073615/how-can-i-get-a-list-of -child-processes-for-a-se-sevice-in-c) – MethodMan 2013-03-26 17:47:36

+0

谢谢你的指出!我在试图理解这一点时,实际上看到了这一点。但是它没有提到我为什么递归调用没有列出所有问题。 – Juicy 2013-03-26 17:55:08

回答

1

你不这样做,你在想什么......

这样你刚上市的孩子。你正在通过'0'来访问空闲的。

尝试这样的事情让所有的进程......

ManagementClass mngcls = new ManagementClass("Win32_Process"); 
foreach (ManagementObject instance in mngcls.GetInstances()) 
{ 
    Console.Write("ID: " + instance["ProcessId"]); 
} 

...那么你在做什么。

+0

谢谢!这就像一个魅力。 – Juicy 2013-03-26 18:37:36

+0

np,不客气 – NSGaga 2013-03-26 18:38:24

+0

如果你确实有一分钟,我想了解为什么我的代码不起作用? 我实际上是想递归地做到这一点:从进程0开始,让所有0的孩子,移动到第一个孩子,让所有的孩子...... – Juicy 2013-03-26 18:39:25

相关问题