Process.Start()和Process Tree

use*_*665 9 .net c#

我如何使用Process.Start(),但启动的进程与启动进程不在同一个进程树中?

考虑此示例控制台应用程序

using System;
using System.Diagnostics;
using System.Threading;

internal class Program
{
    private static void Main(string[] args)
    {
        Console.WriteLine("Starting ie...");
        Process.Start("c:\\Program Files\\Internet Explorer\\iexplore.exe", "http://www.google.com");
        Console.WriteLine("Waiting for 15 seconds");
        Thread.Sleep(15000);
        Console.WriteLine("Exiting...");
    }
}
Run Code Online (Sandbox Code Playgroud)

当此程序正常退出时,Internet Explorer将继续运行.但是,如果在15秒睡眠期间您转到任务管理器并选择此程序并选择"结束进程树",Internet Explorer也将关闭.

(这与我今天早些时候的问题直接相关,到目前为止,还没有回复.在Windows XP中,当屏幕保护程序结束时,它似乎结束了进程树,而在Vista中,只是屏幕保护程序进程结束.)

noc*_*ura 15

Eric是正确的:Windows不公开任何更改进程父级的方法.但是,如果父母去世,则没有回到祖父母的链接,因此您可以通过启动孩子的中间过程来实现目标,然后死亡.

所以:Proc A启动proc B,然后proc B启动proc C并立即死亡.当proc B死掉时,proc C将成为进程树上的根节点 - proc B将在proc B死后不在proc A的树中.

  • 非常聪明......看起来你实际上可以使用cmd.exe作为中间进程:Process.Start("cmd.exe","/ c start iexplore.exe <url>"); 很好的答案,比我的简单得多!:-) (6认同)

Rem*_*eau 5

尝试在调用 Process.Start() 之前将 Process.StartInfo.UseShellExecute 设置为 False(默认为 True)。这样,内部使用 CreateProcess() 而不是 ShellExecute()。