zoukankan      html  css  js  c++  java
  • 转载_备份】 C# WebBrowser强制使新窗口网页只在WebBrowser打开

    原帖见:http://blog.csdn.net/maji9370/archive/2009/12/04/4938865.aspx

    最近写了个软件叫WebBrowser,目的用于,网页的自动操作处理,就是说,所有你在网页上面的操作,都可以录到一个脚本中,然后可以回放这个操作过程。。我是说任何过程。

    程序是用C#写的,其中遇到了一个难题,对于网页,我是用C#内置的WebBrowser控件控制,但是这个控件有个问题,就是对于一些网页上的链接,如果你在IE打开的时候,它是在新窗口打开的话,这时候,你在WebBrowser点击的话,它会傻不垃圾的打开IE来浏览,这样的话,我怎么在我的程序控制新打开的网页啊,真是的,必须使用所有点击的网页都在我的WebBrowser里面打开,我才可以控件其自动化动作处理。

    但是,这么巧,C#内置的WebBrowser就是没有强制使这一实现的方法,于是又google了海内外,发现真是没有什么好办法,健壮,稳定的方法,唉,又得自已解决。。。

    一般在网页点击了一个一个在新窗口打开的链接,这时刻,WebBrower的StatusText会是新链接的url,这时候,可以使用MainBrowser_NewWindow消息,使用e.Cancel=true,取消息打开新窗口动作,然后使用WebBrowser.Navigate(刚才的url),这样就可以达到不调用IE打开新窗口的目的。

    但是有时候,StatusText不是准确的新窗口的url,这时候,WebBrowser反而会打开错的网页。不信,懂编程的朋友可以试一下http://www.hao123.com/上面的百度一下的按钮,你得到的是www.baidu.com/s的url,可是这不是真正的新窗口的url,怎么办呢。。。

    其实,网页会在新窗口打开链接,是因为链接里面有一个属性target设置成blank了,如果我们把它设置回_self,那就OK了。。。

    结合上面的分析,我的解决方法如下:

    代码说明一切吧,如下:

     

     

    代码1
     1         private void wB_MainBrowser_NewWindow(object sender, CancelEventArgs e)
     2         {
     3             e.Cancel = true;
     4             try
     5             {
     6                 string url = this.wB_MainBrowser.Document.ActiveElement.GetAttribute("href");
     7 
     8                 this.wB_MainBrowser.Url = new Uri(url);
     9             }
    10             catch
    11             {
    12             }
    13         }
    14 
    15 

    上面是第一次避免,下面是第二种分析实现,使用装载回来的网页上面所有的控件的target属性修改还_self.

     

    代码
     1         private void SetAllWebItemSelf(HtmlElementCollection items)
     2         {
     3             try
     4             {
     5                 foreach (HtmlElement item in items)
     6                 {
     7                     if (item.TagName.ToLower().Equals("iframe", StringComparison.OrdinalIgnoreCase)==false)
     8                     {
     9                         try
    10                         {
    11                             item.SetAttribute("target""_self");
    12                         }
    13                         catch
    14                         { }
    15                     }
    16                     else
    17                     {
    18                         try
    19                         {
    20                             HtmlElementCollection fitems = item.Document.Window.Frames[item.Name].Document.All;
    21 
    22                             this.SetAllWebItemSelf(fitems);
    23                         }
    24                         catch
    25                         { }
    26                     }
    27                 }
    28             }
    29             catch
    30             {
    31             }
    32         }
    33 
    34 

     

    当然,在网页最终装载完毕的时候,调用上面的方法,如下:

     

                        //complete之前,将document上面所有的的控件的target 设置成_self,避免,新窗口变成IE默认打开
                        this.SetAllWebItemSelf(this.wB_MainBrowser.Document.All);

     

    关于怎能判断WebBrowser最终装载完毕的方法,请看我另一篇文章《[原创]C# WebBrowser准确判断网页最终装载完毕

    这样的话,网页一旦装载完毕后,所有的控件的target都变成_self了,以后,你点什么链接都是变在在本网页打开了,一般情况下也不会触发MainBrowser_NewWindow,第一步,只是以防万一。

    上面的方法,已经可以使用90%的链接可以在本网页打开了,有一些是flash,图片链接什么的,比较特殊的,还有一点不足。

    对于普通的,已经可以了,不信可以试试http://www.hao123.com/ google的搜索结果等,原先在IE新窗口打的,现在在WebBrowser内打开了,呵呵。

  • 相关阅读:
    Java后台插件(工具包)
    LINQ系列:Linq to Object联接操作符
    LINQ系列:Linq to Object排序操作符
    LINQ系列:Linq to Object限制操作符
    LINQ系列:Linq to Object投影操作符
    LINQ系列:C#中与LINQ相关特性
    设计模式笔记:简单工厂模式(Simple Factory)
    数据访问模式:数据并发控制(Data Concurrency Control)
    数据访问模式:Identity Map(标识映射)模式
    设计模式笔记:开闭原则(OCP,The Open-Closed Principle)
  • 原文地址:https://www.cnblogs.com/Comet/p/1938495.html
Copyright © 2011-2022 走看看