C# 列出进程的所有子进程

C# 列出进程的所有子进程,c#,process,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_proce

我试图列出给定进程(给定进程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)上获得的输出:


到此为止。我希望系统中的每个孩子都能继续这样做,然后是这些孩子的每个孩子。

你没有做你想做的事

这样的话,你只是在列出孩子们。您正在通过“0”访问空闲的一个

尝试这样的方法来获取所有进程

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

…那么你在做什么。

谢谢你指出这一点,这可能是重复的!事实上,我之前在试图理解这一点时看到了这一点。但是它没有提到我遇到的问题,即为什么递归调用没有列出它们。如果你有时间,我想了解为什么我的代码不工作?实际上,我想递归地这样做:从进程0开始,获取0的所有子进程,继续到第一个子进程,获取所有子进程……简单地说,你的推理是错误的,因为进程0不是
根,只是另一个进程——据我所知,树的根是不存在的,因此,您必须使用不同的查询来获得一个,然后是另一个-如果您将其组合在一起,则是相同的
ManagementClass mngcls = new ManagementClass("Win32_Process");
foreach (ManagementObject instance in mngcls.GetInstances())
{
    Console.Write("ID: " + instance["ProcessId"]);
}