分享

监听WPF的WebBrowser控件弹出新窗口的事件

 风中Robin 2012-06-23
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 控件连接到处理该控件的事件的客户端”。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多