打开APP
userphoto
未登录

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

开通VIP
监听WPF的WebBrowser控件弹出新窗口的事件
WPF中自带一个WebBrowser控件,当我们使用它打开一个网页,例如百度,然后点击它其中的链接时,如果这个链接是会弹出一个新窗口的,那么它会生生的弹出一个IE窗口来,而不是在内部跳到该链接。

如果使用Winform的WebBrowser控件,我们可以监听它的NewWindow事件,在这个事件中做一些处理,例如,在新建一个Tab来打开,或者控制它在当前WebBrowser中跳转。很不幸的是,WPF的WebBrowser没有这个事件。

说到底,Winform的WB或者是WPF的WB都是在调用IE的一个控件,因此,Winform能加上的,我们WPF一定也有办法加上。如此,那我们就请出神器Reflector,研究一把。

首先,我们打开Winform的WebBrowser,找到触发NewWindow事件的代码:
  1.     protected virtual void OnNewWindow(CancelEventArgs e)
  2.     {
  3.         if (this.NewWindow != null)
  4.         {
  5.             this.NewWindow(this, e);
  6.         }
  7.     }
复制代码
它是在OnNewWindow方法中触发的。那么,是谁调用了这个OnNewWindow呢?接着搜索,最后在一个叫 WebBrowserEvent的类里面发现这么一段:
  1. public void NewWindow2(ref object ppDisp, ref bool cancel)
  2. {
  3.     CancelEventArgs e = new CancelEventArgs();
  4.     this.parent.OnNewWindow(e);
  5.     cancel = e.Cancel;
  6. }
复制代码
我们接着搜NewWindow2,却发现没有地方显式地调用它了。既然从方法入手没找到,那我们就来研究一下定义这个方法的 WebBrowserEvent,看看是谁在使用它。
仔细搜索一遍,最后发现在WebBrowser的CreateSink方法中有这么一段:
  1. protected override void CreateSink()
  2. {
  3.     object activeXInstance = base.activeXInstance;
  4.     if (activeXInstance != null)
  5.     {
  6.         this.webBrowserEvent = new WebBrowserEvent(this);
  7.         this.webBrowserEvent.AllowNavigation = this.AllowNavigation;
  8.         this.cookie = new AxHost.ConnectionPointCookie(activeXInstance, this.webBrowserEvent, typeof(UnsafeNativeMethods.DWebBrowserEvents2));
  9.     }
  10. }
复制代码
注意这句话:
  1. this.cookie = new AxHost.ConnectionPointCookie(activeXInstance, this.webBrowserEvent, typeof(UnsafeNativeMethods.DWebBrowserEvents2));
复制代码
很显然,这句话是关键。AxHost.ConnectionPointCookie类的作用是:“将一个ActiveX 控件连接到处理该控件的事件的客户端”。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
C#调用WebBrowser NewWindow
如何对webbrowser和IE编程(十)
问一个SHDocVwCtl.WebBrowser的问题
WebBrowser控件说明
适用于 Visual Basic 6.0 用户的 WebBrowser 控件
WebBrowser控件的常用方法、属性和事件
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服