Process.Start(“IEXPLORE.EXE”)在启动后立即触发退出事件..为什么?

时间:2009-12-01 09:44:11

标签: c# process internet-explorer-8

我在xp中安装IE8时遇到了一个奇怪的问题。我试图使用c#中的System.Diagnostics.Process.Start方法启动IE。我需要捕获IE的退出事件并执行一些操作。但我最终遇到了一个相当奇怪的问题,IE在发布后会立即触发退出的事件。

这是示例代码

     Process objProcess = Process.Start("IEXPLORE.EXE", "http://google.com");

     if (objProcess != null)
    {
        objProcess.EnableRaisingEvents = true;
        objProcess.Exited += new EventHandler(myProcess_Exited);        
    }

    public  static void myProcess_Exited(object sender, System.EventArgs e)
    {
        MessageBox.Show("You exited");
    }

但上面的代码完全适用于laucnching不同的进程(例如:notepad),当我关闭exe时它会触发exit事件。

这只会让问题启动IE 8.有人可以澄清我的问题是什么吗?

更新

大多数朋友回复了我的帖子并说明为什么你不能只使用网址?为何坚持使用IE浏览器?

这里的原因

该应用程序的最终目标是从Windows应用程序启动URL,并在IE上工作时隐藏exe。关闭IE后显示exe。

由于

3 个答案:

答案 0 :(得分:21)

最有可能的是你已经将IE作为一个进程运行,所以当你尝试再次作为一个新进程启动它时,它看起来已经有IE运行,告诉它用户启动了一个新窗口(所以最初的IE将创建一个“新”窗口而不是新窗口并退出。

可能的解决方案: 尝试使用“-nomerge”命令行选项启动该过程:

    Process objProcess = Process.Start("IEXPLORE.EXE", "-nomerge http://google.com/");

有趣的观察objProcess.ExitCode(至少对于IE8)如果退出将控制权传递给另一个实例将等于0,如果是1则为{{1}}实际上由用户关闭。

答案 1 :(得分:3)

如果机器上已经运行了另一个iexplore.exe实例,则新实例将连接到该实例并立即退出。此外,即使在iexplore未运行的情况下,Internet Explorer 8的multiprocess architecture也可能具有父启动子代理进程并立即退出。

但这些答案除了重点之外。您不应该直接启动Internet Explorer。如果用户配置了另一个默认浏览器,他们会因为忽略了他们的偏好而感到不快。相反,你为什么不试试

System.Diagnostics.Process.Start("http://google.com");

直接,这将做正确的事情。您将无法判断浏览器何时关闭,但如果该命令在现有浏览器会话中打开了新选项卡,则浏览器关闭事件对您的应用程序将毫无意义。

答案 2 :(得分:1)

也许IEXPLORE本身会为URL启动不同的流程并结束您创建的流程?就像Unix上的fork一样?