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.这样的,直接用不了,不知道哪位大侠有解决的办法?  

 

前端监控性能指标 文章目录前端监控性能指标性能指标阶段性指标关键性能指标小程序W3C Level 1兼容性常规用法注意事项1、计算HTML文档请求使用 Nav Timing2、计算静态资源使用 getEntriesByType('resource') 代替 getEntries()3、secureConnectionStart 问题4、跨域资源设置响应头 Timing-Allow-Origin5、注意属性值为 0 ... 阅读详情

相关推荐

升降机SEW MOVIDRIVE变频器设置

选择PO1 第2,3,9,13 位,点击“SendPA”Start reference,编码器反馈值为0(PI2/3 Actual position=0)提示:传送参考位置前请断开变频器安全24V电源,否则会弹出禁止修改提示框;提示:做这一步时,如果出现电机不能转动,或产生报警不能通过编码器匹配。下载配置的参数,提示:下载参数需要断开变频器的安全24V电源。编码器匹配通过后点击下一步,进入下图画面传送参考位置。1电机不能转动:a可能是由于变频器的安全24V未给。点击2.SEW总线扩展定位,定位块设置。

xdpcxq的专栏 5397

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

Python量化交易入门:天勤量化TqSdk保姆级教程(含避坑指南)

本文提供Python量化交易入门指南,重点介绍天勤量化TqSdk的使用方法,包括环境配置、核心API实战、策略开发技巧及实盘部署。教程涵盖中国期货市场,帮助个人投资者快速掌握量化交易技术,避开常见陷阱。

weixin_29065791的博客 834

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

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

weixin_30542079的博客 534

光伏储能交直流微电网Matlab/Simulink仿真模型

首先是光伏储能交直流微电网,这个也是我还是之前在硕士期间在做光伏扶贫项目时候搭建的仿真,仿真由光伏、蓄电池及负载组成的独立直流微电网,提出电压和电流分段式协同控制策略。接下来我将主要更新关于光伏、风电、储能微电网系统相关的内容,包括具体建模和控制。

2401_89292556的博客 785

手把手教你用DCA1000EVM解析IWR6843毫米波雷达数据(附MATLAB代码)

本文提供了一份详尽的实战指南,手把手教你使用DCA1000EVM采集并解析TI毫米波雷达IWR6843的原始数据。内容涵盖硬件连接配置、mmWave Studio参数设置、LVDS数据流结构解析,并附有核心MATLAB代码,详细演示了从原始二进制文件到距离-速度谱的信号处理全链路,帮助开发者快速掌握数据解析与处理的关键步骤。

terraform7cloud的博客 227

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

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

cok8420的博客 627

分子对接中的相互作用特征分析(目视筛查)

介绍分子对接的相互作用特征,以及如何通过这些特征进行目视筛查

recher_He1107的博客 5759

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

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

Vi的专栏 2167

3.1 5分钟搞定!Claude Code接入国产大模型完整教程(附代码)

摘要 本文提供了一份5分钟快速为Claude Code接入国产大模型的完整教程。首先介绍了系统环境要求(Windows/macOS/Linux、Node.js 18+、Python 3.8+),然后详细说明了三种安装Claude Code的方式(npm/yarn/pnpm)。重点讲解了两种国产大模型接入方案:通义千问(推荐)和文心一言,包括获取API密钥、安装SDK、创建MCP服务器、配置Claude Code等步骤。文中提供了详细的代码示例和配置文件模板,确保开发者能快速完成国产大模型的接入,降低使用成本

yonggeit的博客 7926

iOS远程真机之ios-minicap安装使用完全指南

minicap 是开源项目 STF 中的高速截图工具。STF利用此工具不断的传输图片信息并在web端绘制实现 以前只有Android版本,最近有新的ios版本,现在就安装过程中遇到的一些问题进行分享(ps:感谢sorccu 在issue里面给我的指点) 首先上地址:https://github.com/openstf/ios-minicap 你可以git clone或者直接下载zip包。

甫式人生 1万+

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

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

street81的专栏 1847

04 HCM CPI SF集成-员工集成(一)

将员工主数据和组织数据从SAP Successfactors Employee CentraI复制到SAPERP或SAP S/4HANA,SAP SF CPI HCM集成

SAP CPI 146

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

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

weixin_30437337的博客 998

温度PID控制PLC程序

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

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C# webbrowser 禁止跳转到新窗口

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

weixin_30432007的博客 444

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

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

张赐荣的技术博客 707

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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、付费专栏及课程。

余额充值