【发布时间】:2012-07-05 14:33:59
【问题描述】:
我有一个 WPF 应用程序,它使用 Process.Start 方法启动 Internet Explorer(版本 9,在 Win7 X64 上)。
我保存 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 的延续。实际上,我正在使用 SetParent 函数将生成的 IE 嵌入到我的应用程序中。我不能使用 WebBrowser 控件,因为它不支持我正在寻找的隔离。所以当我的应用关闭时关闭IE就可以了。
【问题讨论】:
-
如果您启动一个可见的应用程序,它属于用户,而不是您的应用程序(例如,他们可能会在其中打开新标签)。如果您需要受限浏览器,请在属于您的应用的窗口中使用某种浏览器控件。
-
有a bit of background behind这个要求。基本上,我不能使用 WebBrowser 控件,所以我启动一个新的 IE 并使用 SetParent 在我的应用程序中附加它的窗口。这是有效的,有点难看,但有效。唯一的缺点是我不知道如何实际跟踪实际进程,这会导致内存中出现幽灵进程。但你是对的。在“标准”场景中,这将是一个不好的做法:)
-
正如我所说 - 另一个缺点是用户开始像对待任何其他实例一样对待该 IE 实例(他们可能无法区分它们),并打开新选项卡,指向无关紧要的页面和你一起做。用户不期望退出您的应用程序会杀死他们的 IE 窗口之一。
标签: c# internet-explorer process