2009-10-17 198 views
2

我已经得到了WebBrowser控件在我的默认浏览器打开链接这样的:web浏览器的I帧在默认浏览器中打开

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) 
    { 
     if (e.Url.ToString() != "about:blank") 
     { 
      e.Cancel = true; 
      System.Diagnostics.Process.Start(e.Url.ToString()); 
     } 
    } 

这个伟大的工程,但如果我加载了一个包含一些IFrame的内容的文件的会也在系统浏览器中打开(主要是嵌入式内容,如Google Maps,Digg图标等)。

如何保持Webbrowser控件中的iframe加载和用户单击系统浏览器中的链接?

+0

您的Windows窗体中有WebBrowser控件。你想要在操作系统的浏览器中启动一些Url,并在窗体窗口中启动一些Url? – 2009-10-17 17:59:58

+0

准确。我现在这样做的方式并不理想。像iframe这样的页面元素会触发Navigating事件,所以我会在Firefox中弹出一部分页面,而其余部分(如图像)在Webbrowser控件中静静地加载。 只有用户点击的链接应该在默认浏览器中打开。 – 2009-10-17 19:00:29

回答

2

我已经得出结论,.NET WebBrowser组件在这方面几乎没用。我试图阅读WebBrowserNavigatingEventArgs.TargetFrameName,但它只会返回iframe元素的name属性,只有在HTML文档具有该属性时。否则,它会吐出一个空的""字符串。在非帧链接上返回null会更有用。

所以我找到的唯一修复方法是使用AxWebBrowser控件,特别是在收听BeforeNavigate2事件。我没有尽可能多地进行测试,但看起来DWebBrowserEvents2_BeforeNavigate2Event中的“flags”属性在每次用户触发时都设置为。

private void axWebBrowser1_BeforeNavigate2(object sender, AxSHDocVw.DWebBrowserEvents2_BeforeNavigate2Event e) 
{ 
    // 64 means user triggered 
    if ((int)e.flags == 64 && e.uRL.ToString() != "about:blank") 
    { 
     e.cancel = true; 
     System.Diagnostics.Process.Start(e.uRL.ToString()); 
    } 
} 

MSDN文档说,flags是IE7 +唯一的参数,所以我不知道对IE6的机器会发生什么......

Using Internet Explorer from .NET有关于AxWebBrowser一些真正有价值的信息。

+0

也要注意,没有必要使用COM控件。您可以轻松地展开WebBrowser,以便按照http://blogs.artinsoft.net/mrojas/archive/2008/09/18/newwindow2-events-in-the-c中所述挂钩所需事件(在这种情况下为BeforeNavigate2) -webbrowsercontrol.aspx – 2009-11-07 20:01:15

+0

终于在IE6上测试了一下,你知道些什么?有用。好极了! – 2009-11-12 12:13:52