【问题标题】:How to close Internet Explorer when it has been ran with Process.Start?使用 Process.Start 运行 Internet Explorer 时如何关闭它?
【发布时间】: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


【解决方案1】:

Internet Explorer 的每个选项卡都是一个进程。如果您打开带有多个标签的 IE 或用户打开另一个标签,则不足以杀死进程。

但是

_process.Close();

释放所有属于_process的资源。您可以使用_process.Kill() 方法代替它。

【讨论】:

  • 这实际上杀死了 Internet Explorer 的实例。我对这种技术有点不舒服,因为我不确定杀死一个进程,而不是告诉它正确关闭,不会有副作用。
  • _Process.Close() 最终调用 _Process.Kill() 所以我看不出有什么区别。你有没有试过,看看它是否可行,我的意思是你已经在“我正在使用黑客”来做你想做的事。
【解决方案2】:

为了更好的安全性和稳定性,IE8 使用松耦合 Internet Explorer (LCIE) 架构,并在单独的进程中运行浏览器框架和选项卡。 LCIE 可防止故障和挂起导致整个浏览器崩溃,并带来更高的性能和可扩展性。我在Wikipedia 上读到了这篇文章。

您可以disable LCIE,但我不确定您为什么要这样做。我会考虑使用上面@Damien_The_Unbeliever 提到的解决方案。

【讨论】:

  • 我不会禁用 LCIE 或任何可以更改用户配置的东西。正如我对@damien_the_unbeliever 所说,对于更复杂的问题,我不能使用 Web 浏览器控件。仅供参考,我使用 -noframemerging 来确保 IE 在新进程中启动(实际上是新会话)。也许有办法让这个特定的 IE 实例关闭它的所有选项卡?
  • 现在你知道为什么进程id不一样了,你应该问一个新问题。如何在 IE9 中获取/查找特定选项卡的进程 ID?
【解决方案3】:

我的 win32 应用程序中有一个 IE 应用程序,我正在使用 Win32Api - SendMessage with WM_CLOSE = 0x0010

SendMessage(handle,0x0010,IntPtr.Zero, IntPtr.Zero)}

这将关闭 IE,但您需要拥有浏览器的特定句柄(IEFrame 类)。

有一个缺点,如果您有多个选项卡,IE 会打开确认关闭对话框,这会阻止关闭过程。

克服对话框打开的一种方法是将其复选框设置为(始终关闭),但对我来说这不是一个选项。

【讨论】:

    猜你喜欢
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 2010-12-06
    • 1970-01-01
    相关资源
    最近更新 更多