2

我有一个 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命令行参数,但它看起来并不能解决问题。

[编辑]这是我几天前提出的另一个问题的延续。实际上,我正在使用 SetParent 函数将生成的 IE 嵌入到我的应用程序中。我不能使用 WebBrowser 控件,因为它不支持我正在寻找的隔离。所以当我的应用关闭时关闭 IE 是可以的。

4

3 回答 3

0

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

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

于 2012-07-05T14:55:48.960 回答
0

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

_process.Close();

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

于 2012-07-05T14:49:58.163 回答
0

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

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

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

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

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

于 2016-03-03T11:52:16.523 回答