如何在使用Process.Start运行Internet Explorer时关闭它?

时间:2012-07-05 14:34:00

标签: c# internet-explorer process

我有一个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的延续。实际上,我正在使用Pinvoking SetParent函数在我的应用程序中嵌入生成的IE。我不能使用WebBrowser控件,因为它不支持我正在寻找的隔离。所以当我的应用程序关闭时关闭IE是可以的。

3 个答案:

答案 0 :(得分:0)

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

但是

_process.Close();

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

答案 1 :(得分:0)

为了更好的安全性和稳定性,IE8使用Loosely Coupled Internet Explorer(LCIE)架构,并在不同的进程中运行浏览器框架和选项卡。 LCIE可以防止故障和挂起导致整个浏览器崩溃,从而带来更高的性能和可扩展性。我在Wikipedia上看了这个。

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

答案 2 :(得分:0)

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

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

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

有一个缺点,如果你有一个以上的标签,IE打开确认关闭对话框,阻止关闭过程。

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