打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C# webBrowser强制在本窗口打开,禁止在新窗口打开


最近写了个软件叫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了。。。

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

代码说明一切吧,如下:

        private void wB_MainBrowser_NewWindow(object sender, CancelEventArgs e)
        {
            e.Cancel = true;
            try
            {
                string url = this.wB_MainBrowser.Document.ActiveElement.GetAttribute("href");

                this.wB_MainBrowser.Url = new Uri(url);
            }
            catch
            {
            }
        }

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

        private void SetAllWebItemSelf(HtmlElementCollection items)
        {
            try
            {
                foreach (HtmlElement item in items)
                {
                    if (item.TagName.ToLower().Equals("iframe", StringComparison.OrdinalIgnoreCase)==false)
                    {
                        try
                        {
                            item.SetAttribute("target", "_self");
                        }
                        catch
                        { }
                    }
                    else
                    {
                        try
                        {
                            HtmlElementCollection fitems = item.Document.Window.Frames[item.Name].Document.All;

                            this.SetAllWebItemSelf(fitems);
                        }
                        catch
                        { }
                    }
                }
            }
            catch
            {
            }
        }

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

                    //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内打开了,呵呵。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/maji9370/archive/2009/12/04/4938865.aspx

=======================================上面的有点乱,看下面的=======================================

有时需要用WebBrowser加载URL,来实现某些功能。而这时,我们就不希望所打开的页面中的链接,在新窗口中打开,因为这样的话,实际上是用系统默认的浏览器打开了,从而脱离了你的WebBrowser,也就不能被你所控制了。

要解决这个问题,可以使用下面的方法:

假设WebBrowser的Name是 webBrowser

简单方法-利用加载完成事件将所有的链接和form的target值改为"_seft":



privatevoidwebBrowser_DocumentCompleted(objectsender, WebBrowserDocumentCompletedEventArgs e)
{
    //将所有的链接的目标,指向本窗体
    foreach(HtmlElement archor inthis.webBrowser.Document.Links)
    {
        archor.SetAttribute("target", "_self");
    }
  
    //将所有的FORM的提交目标,指向本窗体
    foreach(HtmlElement form inthis.webBrowser.Document.Forms)
    {
        form.SetAttribute("target", "_self");
    }
}

取消新窗口事件



privatevoidwebBrowser1_NewWindow(objectsender, CancelEventArgs e)
{
     e.Cancel = true;
}

将 WebBrowser 的 AllowWebBrowserDrop 设为 false(禁止拖放)

将 WebBrowser 的 WebBrowserShortcutsEnabled 设为 false(禁止使用快捷键)
将 WebBrowser 的 IsWebBrowserContextMenuEnabled 设为 false(禁止右键上下文菜单)

本文地址:http://www.cnblogs.com/ATree/archive/2010/09/08/WebBrowser-target_seft_blank.htmlhtml

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
WebBrowser控件的常用方法、属性和事件
WebBrowser控件应用:弹出新窗体和关闭窗口
webbrowser控件屏蔽网页错误
C# webBrowser控件使用心得
MOX.cc [vb.net中webBrowser控件的问题?如何使弹出的网页在 本身 w...
WebBrowser抓图示例——截取网页上的验证码图片
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服