C#封装WebBrowser时NewWindow事件无法获取Url的解决方法
来源:互联网 发布:泉州旅游数据分析 编辑:程序博客网 时间:2024/06/16 19:10
本文为转载,查看原文请点击 原文链接
重写一个WebBrowser,代码如下,亲测可用
public class WebBrowserExtendedNavigatingEventArgs : 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; } } 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 BeforeNavigate; public event EventHandler BeforeNewWindow; protected void OnBeforeNewWindow(string url, out bool cancel) { EventHandler 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 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); } } 使用方法: ExtendedWebBrowser webBrowser; private void webBrowser_BeforeNavigate(object sender, EventArgs e) { } //增加了这个事件,可以替代原来的NewWindow事件. private void webBrowser_BeforeNewWindow(object sender, EventArgs e) { WebBrowserExtendedNavigatingEventArgs eventArgs = e as WebBrowserExtendedNavigatingEventArgs; webBrowser.Navigate(eventArgs.Url); eventArgs.Cancel = true; } private void FrmWebBrowser_Load(object sender, EventArgs e) { webBrowser.Navigate("http://www.google.com/"); }
0 0
- C#封装WebBrowser时NewWindow事件无法获取Url的解决方法
- C#调用WebBrowser NewWindow
- WebBrowser的NewWindow事件中不能取得新Url的补充
- c# webBrowser 获取js中的alert事件
- c# webBrowser 获取js中的alert事件
- c# webBrowser 获取js中的alert事件
- VB.NET扩展WebBrowser,拥有跳转前获取URL的能力,扩展事件
- 关于webbrowser无法播放html5的解决方法
- C#下的Webbrowser的KeyDown事件
- c# 中webBrowser获取一个没有id和name属性的input标签的click事件
- C#获取webbrowser源码
- c# webbrowser获取cookies
- C# WebBrowser 取 window.open 新窗口 url的方法
- C# 中webBrowser弹出IE窗体时,获取IE窗体的链接地址,然后再从webBrowser中打开
- Java代码中使用response.redirect(url)方法,无法获取到中文的解决方法
- C#获取URL的参数
- C# 网络编程之webBrowser获取网页url和下载网页中图片
- WebBrowser控件的事件
- git学习
- Android初级教程:使用xml序列器
- Go起步:2、Go指南,编辑器--Visual Studio Code和LiteIDE
- js onclick函数中传字符串参数的问题
- 避免Activity内存泄露
- C#封装WebBrowser时NewWindow事件无法获取Url的解决方法
- 点击空白处,软键盘消失
- 初学C语言:求圆周率pi的近似值(pi/4=1-1/3+1/5-1/7...)
- UICollectionView原理
- Android 之 NumberProgressBar
- 每天一个linux命令(10):cat 命令
- mybatis—简单的sql总结
- EL表达式 (详解)
- jdk 动态代理