2013-03-26 27 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

相關問題