我有一个使用Process.Start
方法启动Internet Explorer(版本9,在Win7 X64上)的WPF应用程序。如何在使用Process.Start运行时关闭Internet Explorer?
我保存ProcessID以便在应用程序关闭时关闭它。但是,当应用程序退出时,Internet Explorer仍在任务管理器中可见。
这里是我使用的代码:
public class MyClass : IDisposable
{
Process _process;
public void Go()
{
ProcessStartInfo psi = new ProcessStartInfo {
FileName = "iexplore.exe",
Arguments = "-noframemerging -private \"http://whathaveyoutried.com\""
};
_process = Process.Start(psi);
_process.WaitForInputIdle();
}
private void Close(object sender, RoutedEventArgs e)
{
if (_process != null)
{
_process.Refresh();
_process.Close();
}
}
public void Dispose()
{
if (_process != null)
{
_process.Refresh();
_process.Close();
}
}
}
}
我仔细检查了,调用_process.Close()
实际完成的。
什么会导致此行为?
PS:我怀疑这是由于Internet Explorer的内部。运行这个exe不需要创建一个新的进程,但可以使用一些IPC来控制其他实例。我使用-noframemerging
命令行参数,但它并不希望解决问题。
[编辑]这是另一个question I asked few days ago的延续。其实,我是Pinvoking SetParent函数来在我的应用程序中嵌入生成的IE。我无法使用WebBrowser控件,因为它不支持我正在寻找的隔离。因此,当我的应用程序关闭时关闭IE即可。
如果启动一个可见的应用程序,它属于用户,而不是您的应用程序(例如,他们可能会在那里打开新的标签页)。如果您想要受限制的浏览器,请在属于您的应用的窗口中使用某种浏览器控件。 – 2012-07-05 14:43:55
这个需求[背后有一点背景](http://stackoverflow.com/questions/11186817)。基本上,我不能使用WebBrowser控件,所以我启动一个新的IE并使用SetParent在我的应用程序中附加它的窗口。这工作,有点丑陋,但工作。唯一的缺点是我不知道如何实际跟踪实际的过程,并导致内存中的虚影过程。但你是对的。在一个'标准'的情况下,这将是一个不好的做法:) – 2012-07-05 14:48:45
正如我所说 - 另一个缺点是,用户开始对待该IE实例像任何其他(他们可能无法区分),并打开新标签页,指着与你无关的网页。用户*不会期望退出应用程序将会终止其IE窗口之一。 – 2012-07-05 14:50:18