如何关闭Internet Explorer时,它已经跑了的Process.Start?(How to

2019-09-19 03:42发布

我有开始使用Internet Explorer WPF应用程序(第9版,Win7上X64) Process.Start方法。

我保存的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命令行参数,但它看起来并不解决问题。

[编辑]这是另一种延续问题,我问前几天 。 事实上,我Pinvoking SetParent函数embbed衍生的IE浏览器在我的应用程序。 我不能使用WebBrowser控件,因为它不支持我要找的隔离。 因此,它是确定关闭IE浏览器时,我的应用程序关闭。

Answer 1:

Internet Explorer中的每一个标签是一个过程。 如果您打开IE浏览器多标签或用户打开另一个标签,它不会是足以杀死进程。

_process.Close();

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



Answer 2:

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

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



Answer 3:

我在我的Win32应用程序的IE应用程序,我使用Win32Api - SendMessage with WM_CLOSE = 0x0010

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

这将关闭IE浏览器,你需要怎么过让浏览器(类IEFrame)的具体处理。

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

克服了对话开幕一种方法是将其设置复选框(总是关闭),但对我来说ITTS不是一种选择。



文章来源: How to close Internet Explorer when it has been ran with Process.Start?