列出流程的所有子项

时间:2013-03-26 17:39:27

标签: c# process

我正在尝试列出给定进程的所有子进程(给定进程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(x86)上获得的输出:

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

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

1 个答案:

答案 0 :(得分:1)

你没有做你在想的事情......

那就是你只是列出孩子的方式。而你正在通过'0'访问空闲的那个。

尝试这样的方法来获得所有流程...

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

......那你正在做什么。