使用C#编程以程序化方式终止进程树

63

我正在使用类似以下代码的方式通过程序启动Internet Explorer:

ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe");
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = "http://www.google.com";
Process ieProcess = Process.Start(startInfo);

这会在Windows任务管理器中生成2个进程。然后我尝试使用以下命令终止进程:

ieProcess.Kill();

这将导致任务管理器中的一个进程被关闭,而另一个进程保留。我尝试查找具有子进程的任何属性,但未找到。如何同时结束另一个进程?更一般地说,如何结束使用Process.Start启动的所有相关进程?


1
也许我漏掉了什么,但是为什么这会启动两个进程? - Etienne de Martel
@Etienne 我不知道,我也是这么想的。但是当我正常启动IE时,它也会启动2个进程。我不知道这是否值得注意,但我在64位机器上使用32位IE。 - robr
1
@Etienne de Martel:IE在其用户界面中使用多个进程,基本上是1个主进程+每个打开的选项卡一个子进程。 - Dirk Vollmar
很有趣,我以为它只是像Firefox一样工作,有一个进程和一堆不断挂起的线程。 - Etienne de Martel
感谢您修改过的代码片段/类。 - binball
11个回答

0

如何在PowerShell中正确关闭Internet Explorer?

在上述讨论中,有几位评论者指出这是Win7中的一个错误(因为似乎对于使用其他版本的Windows的用户来说并不会发生)。包括微软在内的许多网页都声称是用户错误,并告诉您只需使用IE对象上可用的退出方法即可关闭所有子进程(据报道,在Win8 / XP等版本中确实可以做到)

我必须承认,对于我来说,这确实是用户错误。我在win7中,退出方法无法正常工作的原因是由于编码错误。换句话说,我在声明时创建了IE对象,然后在代码的后面创建了另一个(附加到同一对象)......当我意识到这个问题时,我已经快要完成父子杀戮例程的黑客工作了。

由于IE的功能,您生成的父进程的进程ID可能附加到您没有创建的其他窗口/子进程上。使用退出方法,并记住,根据用户设置(例如退出时清空缓存),可能需要几分钟才能完成进程的任务并关闭。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接