Process.Start(“IEXPLORE.EXE”)在启动后立即启动Exited事件。为什么?
我有一个奇怪的问题与安装在XP中的IE8。我试图在C#中使用System.Diagnostics.Process.Start方法启动IE。我有一个要求来捕获IE的退出事件并做一些操作。但是我最终遇到了一个很奇怪的问题,那就是IE在发布后立即启动退出的事件。Process.Start(“IEXPLORE.EXE”)在启动后立即启动Exited事件。为什么?
这是示例代码
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不同处理时完全运作(例如:记事本)时和关闭该exe它触发的退出事件。
这只会给问题启动IE 8。有人可以澄清我是什么问题?
UPDATE
多数朋友说我的文章,说你为什么不能只使用一个网址?为什么坚持使用IE?
这里的原因
应用程序的最终目的是从Windows应用程序启动一个URL,并在IE工作时,将隐藏的exe文件。并关闭IE后显示exe。
感谢
最有可能的是,你有IE浏览器已经在运行的过程中,因此,当您尝试再次启动它作为一个新的进程,它看起来有IE运行已,告诉它用户启动一个新窗口(所以最初的IE将创建一个“新窗口”而不是一个新窗口)并退出。
可能的解决方案: 尝试从开始 “-nomerge” 命令行选项的过程:
Process objProcess = Process.Start("IEXPLORE.EXE", "-nomerge http://google.com/");
有趣的观察:objProcess.ExitCode
(对于IE8至少)将等于0
如果退出通过控制到另一个实例,并且如果它实际上由用户关闭,则返回1
。
也许IEXPLORE本身会启动一个不同的过程,URL和结束进程时创建?像Unix上的fork
一样?
这也引起了我的想法...... iexplore.exe实际上是踢别的东西或为主程序创建另一个进程。 – Bobby 2009-12-01 10:12:57
如果iexplore.exe的另一个实例已经在机器上运行,新的实例将连接到并立即退出。此外,即使在iexplore未运行的情况下,Internet Explorer 8的multiprocess architecture也可能具有父启动子代理程序进程并立即退出。
但是,这些答案是重点。您不应该直接启动Internet Explorer。如果用户配置了另一个默认浏览器,他们会不高兴你忽略了他们的偏好。相反,你为什么不尝试
System.Diagnostics.Process.Start("http://google.com");
直接,这将做正确的事情。您将无法分辨浏览器何时关闭,但如果该命令已在现有浏览器会话中打开新选项卡,则浏览器关闭事件对您的应用程序将没有意义。
在我的系统上(XP SP 3,.NET Framework 3.5,IE 8),这段代码没有任何问题。也许你有权限问题? – Jehof 2009-12-01 09:54:02
你试过用其他IE窗口已经打开吗? – RameshVel 2009-12-01 10:03:55
请注意,具有不同默认浏览器的用户不会意识到您打开IE。您可以尝试将URL传递给'Process.Start',但确保设置了UseShellExecute。当然,这确实复杂检查浏览器是否退出... – Thomas 2009-12-01 10:11:53