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(x86)で得られる出力です:

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

そこで止まります。私はそれがシステムの各子、そしてそれらの子の各子で継続することを期待します。

4

1 に答える 1

2

あなたはあなたが考えていることをしていません...

そうすれば、あなたはただ子供をリストしているだけです。そして、あなたは「0」によってアイドル状態のものにアクセスしています。

このようなものを試して、すべてのプロセスを取得してください...

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

...それからあなたがしていること。

于 2013-03-26T18:09:49.167 に答える