2012-07-05 88 views
2

我有一个使用Process.Start方法启动Internet Explorer(版本9,在Win7 X64上)的WPF应用程序。如何在使用Process.Start运行时关闭Internet Explorer?

我保存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即可。

+0

如果启动一个可见的应用程序,它属于用户,而不是您的应用程序(例如,他们可能会在那里打开新的标签页)。如果您想要受限制的浏览器,请在属于您的应用的窗口中使用某种浏览器控件。 – 2012-07-05 14:43:55

+0

这个需求[背后有一点背景](http://stackoverflow.com/questions/11186817)。基本上,我不能使用WebBrowser控件,所以我启动一个新的IE并使用SetParent在我的应用程序中附加它的窗口。这工作,有点丑陋,但工作。唯一的缺点是我不知道如何实际跟踪实际的过程,并导致内存中的虚影过程。但你是对的。在一个'标准'的情况下,这将是一个不好的做法:) – 2012-07-05 14:48:45

+3

正如我所说 - 另一个缺点是,用户开始对待该IE实例像任何其他(他们可能无法区分),并打开新标签页,指着与你无关的网页。用户*不会期望退出应用程序将会终止其IE窗口之一。 – 2012-07-05 14:50:18

回答

0

Internet Explorer的每个选项卡都是一个进程。如果您使用多个选项卡打开IE,或者用户打开了另一个选项卡,则它不足以终止进程。

_process.Close(); 

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

+0

这实际上会杀死Internet Explore的实例。我对这种技术有点不舒服,因为我不确定杀死一个进程,而不是让它正常关机,不会有副作用。 – 2012-07-05 15:06:20

+0

_Process.Close()eventuall调用_Process.Kill(),所以我没有看到区别。你甚至尝试过,看看它是否可行,我的意思是你已经在“我正在使用黑客”来做你想做的事。 – 2012-07-05 15:30:33

0

为了获得更好的安全性和稳定性,IE8使用松散耦合的Internet Explorer(LCIE)体系结构并在不同的进程中运行浏览器框架和选项卡。 LCIE可以防止毛刺和挂起消除整个浏览器,并提高性能和可扩展性。我在Wikipedia上读到这个。你可以disable LCIE,但我不知道你为什么想要这样做。我会考虑使用@Damien_The_Unbeliever上面提到的解决方案。

+0

我不会禁用LCIE或任何可以改变用户配置的东西。正如我对@damien_the_unbeliever所说的,我无法使用Web浏览器控件来解决更复杂的问题。仅供参考,我使用-noframemerging来确保IE在新流程中启动(实际上是新会话)。也许有办法要求这个特定的IE实例关闭它的所有选项卡? – 2012-07-05 15:00:38

+0

现在你知道进程ID为什么不一样了,你应该问一个新问题。我如何在IE9中获取/查找特定选项卡的进程ID? – 2012-07-05 15:15:44

+0

我改写了这个问题 – 2012-07-05 15:24:36

0

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

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

这将关闭IE浏览器,无论你有多需要有浏览器(类IEFrame)的具体处理。

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

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

相关问题