C#重写WebBrowser组件,禁止跳转到IE新窗口、脚本错误

WinForm中的webBrowser控件禁止弹出新窗口 <br />     前两天领导让做一个可以自动填写网页数据并提交的小程序,其中使用到了webBrowser控件,内嵌的网页中的链接会调用本地的IE打开新窗口,影响功能的实现,最后找到了方法解决这一问题:<br />       //打开新窗体时 private void webBrowser1_NewWindow(object sender, CancelEventArgs e) { e.Cancel = true; 阅读详情

来自:http://blog.chinaunix.net/uid-16242888-id-146885.html

刚从delphi转到c#,一切重头开始。上来先做个myBrowser,结果发现无法解决跳转到新窗口问题。从网上找到奇客力大侠的《C# webBrowser禁止在新窗口打开,强制在本窗口打开》文章(http://blog.163.com/da7_1@126/blog/static/104072678201031651754880/),结果发现对重写WebBrowser一窍不通,折腾了2天,又找到百度知道里的一篇问答《在C#中如何重写控件》(http://zhidao.baidu.com/question/48991857.html?fr=qrl&cid=869&index=1&fr2=query),再几经周折才搞定。
为了纪念第一个C#程序的艰难问世,现将过程详细记录如下:

    一、在VS2008里用C#新建一个Windows窗体应用程序,起名为MyBrowser。
    二、在里面添加Label、TextBox、Button,然后整成如下图的样式,同时把各个控件的Anchor和Text归整一下,位置和名称放放好。

    三、重写WebBrowser组件,禁止跳转到IE新窗口。菜单“项目->添加类”,在模板中的“类”图标上确认一下,然后名称改为“ExtendedWebBrowser.cs”。
    (一)在右边解决方案管理器中右击“查看代码”,然后在ExtendedWebBrowser.cs代码窗口将代码修改成如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyBrowser
{
    public class ExtendedWebBrowser : System.Windows.Forms.WebBrowser
    {
        System.Windows.Forms.AxHost.ConnectionPointCookie cookie;
        WebBrowserExtendedEvents events;
        //This method will be called to give you a chance to create your own event sink
        protected override void CreateSink()
        {
            //MAKE SURE TO CALL THE BASE or the normal events won't fire
            base.CreateSink();
            events = new WebBrowserExtendedEvents(this);
            cookie = new System.Windows.Forms.AxHost.ConnectionPointCookie(this.ActiveXInstance, events, typeof(DWebBrowserEvents2));
        }
        protected override void DetachSink()
        {
            if (null != cookie)
            {
                cookie.Disconnect();
                cookie = null;
            }
            base.DetachSink();
        }
        //This new event will fire when the page is navigating
        public event EventHandler<WebBrowserExtendedNavigatingEventArgs> BeforeNavigate;
        public event EventHandler<WebBrowserExtendedNavigatingEventArgs> BeforeNewWindow;
        protected void OnBeforeNewWindow(string url, out bool cancel)
        {
            EventHandler<WebBrowserExtendedNavigatingEventArgs> h = BeforeNewWindow;
            WebBrowserExtendedNavigatingEventArgs args = new WebBrowserExtendedNavigatingEventArgs(url, null);
            if (null != h)
            {
                h(this, args);
            }
            cancel = args.Cancel;
        }
        protected void OnBeforeNavigate(string url, string frame, out bool cancel)
        {
            EventHandler<WebBrowserExtendedNavigatingEventArgs> h = BeforeNavigate;
            WebBrowserExtendedNavigatingEventArgs args = new WebBrowserExtendedNavigatingEventArgs(url, frame);
            if (null != h)
            {
                h(this, args);
            }
            //Pass the cancellation chosen back out to the events
            cancel = args.Cancel;
        }
        //This class will capture events from the WebBrowser
        class WebBrowserExtendedEvents : System.Runtime.InteropServices.StandardOleMarshalObject, DWebBrowserEvents2
        {
            ExtendedWebBrowser _Browser;
            public WebBrowserExtendedEvents(ExtendedWebBrowser browser) { _Browser = browser; }
            //Implement whichever events you wish
            public void BeforeNavigate2(object pDisp, ref object URL, ref object flags, ref object targetFrameName, ref object postData, ref object headers, ref bool cancel)
            {
                _Browser.OnBeforeNavigate((string)URL, (string)targetFrameName, out cancel);
            }
            public void NewWindow3(object pDisp, ref bool cancel, ref object flags, ref object URLContext, ref object URL)
            {
                _Browser.OnBeforeNewWindow((string)URL, out cancel);
            }
        }
        [System.Runtime.InteropServices.ComImport(), System.Runtime.InteropServices.Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"),
        System.Runtime.InteropServices.InterfaceTypeAttribute(System.Runtime.InteropServices.ComInterfaceType.InterfaceIsIDispatch),
        System.Runtime.InteropServices.TypeLibType(System.Runtime.InteropServices.TypeLibTypeFlags.FHidden)]
        public interface DWebBrowserEvents2
        {
            [System.Runtime.InteropServices.DispId(250)]
            void BeforeNavigate2(
                [System.Runtime.InteropServices.In,
                System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.IDispatch)] object pDisp,
                [System.Runtime.InteropServices.In] ref object URL,
                [System.Runtime.InteropServices.In] ref object flags,
                [System.Runtime.InteropServices.In] ref object targetFrameName, [System.Runtime.InteropServices.In] ref object postData,
                [System.Runtime.InteropServices.In] ref object headers,
                [System.Runtime.InteropServices.In,
                System.Runtime.InteropServices.Out] ref bool cancel);
            [System.Runtime.InteropServices.DispId(273)]
            void NewWindow3(
                [System.Runtime.InteropServices.In,
                System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.IDispatch)] object pDisp,
                [System.Runtime.InteropServices.In, System.Runtime.InteropServices.Out] ref bool cancel,
                [System.Runtime.InteropServices.In] ref object flags,
                [System.Runtime.InteropServices.In] ref object URLContext,
                [System.Runtime.InteropServices.In] ref object URL);
        }
    }
    public class WebBrowserExtendedNavigatingEventArgs : System.ComponentModel.CancelEventArgs
    {
        private string _Url;  
//原文此处多了一个空格,注意修改之...散仙闪电注
        public string Url
        {
            get { return _Url; }
        }
        private string _Frame;  //原文此处多了一个空格,注意修改之...散仙闪电注
        public string Frame
        {
            get { return _Frame; }
        }
        public WebBrowserExtendedNavigatingEventArgs(string url, string frame)
            : base()
        {
            _Url = url;
            _Frame = frame;
        }
    }
  }
    (二)回到Form1.cs[设计]窗口,在菜单“生成”中,点“生成解决方案”。一会之后在工具箱的最上方就会出现一个新的组件“ExtendedWebBrowser”,这正是我们需要的,hehe。
    三、回到Form1.cs[设计]窗口,把ExtendedWebBrowser拖进来。
    (一)在属性窗口里调整好Anchor,使之能最大化。
    (二)双击“ScriptErrorSuppressed”,将之属性改为“True”以禁用所有的对话框,比如提示Activex下载、执行以及安全登录等对话框。当然可以参考MSDN上的代码示例( http://apps.hi.baidu.com/share/detail/379735),有的放矢:
private void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    ((WebBrowser)sender).Document.Window.Error += new HtmlElementErrorEventHandler(Window_Error);
}
private void Window_Error(object sender, HtmlElementErrorEventArgs e)
{
    // Ignore the error and suppress the error dialog box.
    e.Handled = true;
}
   (三)在ExtendedWebBrowser的事件里双击“BeforeNewWindow”并添加2行代码:
   private void extendedWebBrowser1_BeforeNewWindow(object sender, MyBrowser.WebBrowserExtendedNavigatingEventArgs e)
        {
           e.Cancel=true;
           ((ExtendedWebBrowser)sender).Navigate(e.Url);
        }
   (四)最后一步,回到Form1.cs[设计]窗口,双击Button按钮,添加代码如下:
      private void button1_Click(object sender, EventArgs e)
        {
            extendedWebBrowser1.Navigate(textBox1.Text);
        }
   
   F5运行,点几个老跳的链接,oh~yeah,成功了!
  ??,还有些不爽,输完网址后还要点登录,像IE一样敲一下回车就好了。说干就干
  (五)TextBox事件中,双击KeyPress(不要用Enter事件,试过不行),添加以下代码
 
     private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)13)
            {
                button1_Click(null,null);
            }
        }
   这下,可以睡觉去了。别忘记保存你的成果喔,byebye...
   等等,最后小声地问一句,这个博客里,如里把代码经过博文编辑器转换后,好看是好看了,但我COPY出来后,前面全加上了1.2.3.这样的,直接用不了,不知道哪位大侠有解决的办法?  

 

5分钟搞懂MSDNet:用Transformer实现小样本语义分割的保姆级教程 本文详细介绍了MSDNet(Multi-Scale Decoder Network)如何利用Transformer架构实现小样本语义分割。通过多尺度解码器和空间Transformer解码器,MSDNet能够在仅有1-5张标注图像的情况下完成精确分割任务。文章提供了PyTorch代码实例和优化技巧,帮助开发者快速掌握这一前沿技术。 阅读详情

相关推荐

全面讲解电子齿轮比与脉冲数计算

什么是编码器分辨率。

viixin的博客 1万+

c#webbrower新窗口显示问题

webbrower在爬网页时有的网站点击某个按钮后会弹出一个新页面,但是webbrower这个时候就不行了 解决方式:引用SHDocVw.dll(路径在c:\windows\system32\shdocvw.dll) private static SHDocVw.WebBrowser_V1 Web_Sub = null; Web_Sub = (SHDocVw.WebBrowser_V1)this.webbrower1.ActiveXInstance; Web_Sub.NewWindo

Y1172215784的博客 682

TEM图像处理实战指南:从基础操作到金属材料分析

本文提供了一份全面的透射电镜(TEM)图像处理实战指南,涵盖从基础操作到金属材料深度分析的全流程。重点讲解了TEM图像预处理、选区电子衍射(SAED)标定、高分辨像(HRTEM)分析及STEM图像应用等核心技能,并结合金属材料(如铝合金、钢)的析出相鉴定、位错分析和界面结构研究等实际案例,帮助研究者从原始数据中准确提取晶体结构、缺陷及成分信息。

weixin_29284201的博客 210

WebBrowser控件应用:弹出新窗体和关闭窗口

缘起:上次写了一个《WebBrowser控件的简单应用2》,提到了在NewWindow事件中打开新窗口的例子。有网友“队长 ”提出那个事件得到的参数是本页面的,而不是新页面的,经过测试,果然url参数不是新页面的。 Open新页面要处理的: 1:<<a href=’xxxxx’ target=’_blank’>>;2: onclick=’window.ope...

weixin_30542079的博客 534

Arm A-profile架构RAS系统设计:可靠性、可用性与可服务性解析

在计算机体系结构中,可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)是构建高可信系统的核心要素。RAS系统通过硬件错误检测、隔离和恢复机制,确保系统持续稳定运行。其技术原理包括ECC内存纠错、冗余执行单元和错误传播阻断等关键技术,可显著降低数据中心等关键业务场景的故障率。现代芯片设计中,Arm A-profile架构提供标准化的RAS框架,涵盖从内存子系统到计算单元的全方位错误管理。通过分层防御策略和统一错误记录格式,实现硬件错误可追溯、可修复。

weixin_30920853的博客 358

智能车竞赛走马观碑组:赛道元素与目标板识别策略解析

本文深入解析了智能车竞赛走马观碑组别的核心挑战与策略。重点探讨了如何应对PVC赛道的光照、磨损及无边界线等复杂环境,并详细阐述了基于红色引导区的目标板高效识别流程。通过平衡轻量化模型选择、实时决策与精准控制,实现赛道元素适应性与目标板识别策略的优化,为参赛者提供了一套完整的系统集成与实战调参思路。

x8y9z0的博客 460

WebBrowser在同一个窗口打开网页,禁止在新窗口打开

WebBrowser在同一个窗口打开网页,无论target是否是_blankNewWindow事件中e.Cancel = true;然后取WebBrowser.StatusText属性就是新窗口的地址 private void...

cok8420的博客 627

C#实战:如何从零构建一个轻量级软PLC梯形图编辑器(附完整源码)

本文详细介绍了如何使用C#从零开始构建一个轻量级软PLC梯形图编辑器。内容涵盖项目架构设计、GDI+图形渲染、编辑交互实现以及核心的扫描执行引擎开发,并提供了定时器、计数器等高级功能的实现思路与完整源码,为开发者深入工业自动化领域提供了实战指南。

4k5l6j7h8的博客 257

C#重写WebBrowser组件,禁止跳转到IE新窗口、脚本错误 (转载)

C#重写WebBrowser组件,禁止跳转到IE新窗口、脚本错误 (转载) ? 从网上找到奇客力大侠的《C# webBrowser禁止在新窗口打开,强制在本窗口打开》文章(http://blog.163.com/da7_1@126/blog/static/104072678201031651754880/),结果发现对重写WebBrowser一窍不通,折腾了

Vi的专栏 2167

FMCW毫米波雷达原理一

1、简介 毫米波雷达的优点是角分辨率高、频带宽因而有利于采用脉冲压缩技术、多普勒颇移大和系统的体积小。目前笔者接触到的有24G毫米波雷达和77G毫米波雷达。 24G毫米波雷达主要应用在交通领域的测距和车辆测速,在其他领域也有使用24G毫米波雷达。 77G毫米波雷达主要应用在无人驾驶,汽车周围的目标检测等领域。 在首次接触雷达时,一头雾水。搞不清一个chirp的时域图和频域图的关系、中频信号以及其他名词的基本概念。在TI培训官网上看到一些毫米波雷达原理的视频才豁然开朗。TI培训官网毫米波传感介绍 本文主要是通

擎天柱工坊 8144

北斗导航 | 接收机自主完好性监测(RAIM)算法近三年研究现状总结(2022-2025)

近三年RAIM算法已从传统的单故障检测演进为多星座协同、智能融合的复杂系统,在航空、自动驾驶等安全关键领域实现规模化应用。未来需重点突破城市复杂环境适应性和标准化体系建设,推动技术从"可用"向"可信"跨越。

尘世冰封的专栏 440

C# winform WebBrowser 让网页在内部打开

今天要用winform做一个网页浏览器,要是只打开一个窗口,代码非常简单,要是像打开百度,163这些的,都不用写代码,直接在Url中设置就行。可是打开窗口后点击里面的链接,就会跳转到IE中打开,觉得很不友好。参考了一下网上的代码,改了下自己的,基本实现了在内部打开。 代码如下:  private void webBrowser1_NewWindow(object sender, CancelE

street81的专栏 1847

Autosar诊断实战系列05-Dcm之0x27加解密服务配置开发详解

UDS 0x27服务实战开发介绍,对解锁尝试次数及delay时间进一步解释。

initiallizer的博客 1993

c#: WebBrowser 禁止在新窗口打开链接

项目中碰到此需求。几番比对,此为最好的解决方案,聊做备忘。 1、加入Microsoft Internet Controls引用: 项目右键->添加引用->COM->Microsoft Internet Controls,加入后,其引用名为SHDocVw。 2、扩展WebBrowser控件: public class WebBrowser :...

weixin_30437337的博客 998

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C# webbrowser 禁止跳转到新窗口

如何将连接为js代码的跳转禁止开新窗口. 转载于:https://www.cnblogs.com/aqdaye/p/5157300.html

weixin_30432007的博客 444

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

张赐荣 | C#WebBrowser防止默认浏览器打开新标签页

C#WebBrowser让网页始终在新页面打开而不是在新标签页弹出默认浏览器打开。 方法是通过修改网页元素的target属性,让"_blank"目标始终在新页面打开,这样就不会弹出新窗口了。 C#代码: 通过绑定WebBrowser的"DocumentCompleted"事件来修改元素的target属性。 private void Wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { WebBro

张赐荣的技术博客 707

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C#调用webbrowser,阻止弹出新HTML页面

参考资料: 1、C#调用webbrowser,阻止弹出新IE窗口 http://www.cnblogs.com/blindman/p/3819649.html 2、【WPF】监听WPF的WebBrowser控件弹出新窗口的事件(这个教程满全的,还有案例代码提供下载) http://www.cnblogs.com/RMay/archive/2010/05/27/1745388.ht...

weixin_30586085的博客 486

webbrowser打开指定html,C#实现 WebBrowser中新窗口打开链接用默认或者指定浏览器打开,不用IE...

首先要捕获打开链接的事件,这个事件在 WebBrowser的NewWindow里面。这里我的WebBrowser命名为announce。所以捕获事件如下:private void announce_NewWindow(object sender, CancelEventArgs e){e.Cancel = true ;//让webbrowser停止默认执行事件,让它不会用IE打开链接了WebBro...

weixin_30390951的博客 1312

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

 [转]C# webBrowser禁止在新窗口打开,强制在本窗口打开2009/02/09 13:33 进行webBrower开发的时候,肯定都会遇到一个问题。那就是怎么样强制在本窗口打开新窗口的问题。网上最常见的解决方法就是,在NewWindow事件中取得要打开的网址,取消打开新窗口,然后在本窗口打开要转向的网址private void webBrowser

xuehuic的成长 3312

C# WebBrowser强制使新窗口网页只在WebBrowser打开

最近写了个软件叫WebBrowser,目的用于,网页的自动操作处理,就是说,所有你在网页上面的操作,都可以录到一个脚本中,然后可以回放这个操作过程。。我是说任何过程。程序是用C#写的,其中遇到了一个难题,对于网页,我是用C#内置的WebBrowser控件控制,但是这个控件有个问题,就是对于一些网页上的链接,如果你在IE打开的时候,它是在新窗口打开的话,这时候,你在WebBrowser点击的话,

马骥的专栏 1万+
上一篇: 抓取正则DEMO
下一篇: WebBrowser控件使用详解
ArvinStudy
博客等级 码龄15年 83粉丝 193原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值