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

来源:互联网 发布:数据酋长刊登工具 编辑:程序博客网 时间:2024/05/06 03:44

进行webBrower开发的时候,肯定都会遇到一个问题。
那就是怎么样强制在本窗口打开新窗口的问题。
网上最常见的解决方法就是,
NewWindow事件中取得要打开的网址,取消打开新窗口,然后在本窗口打开要转向的网址

  1. private void webBrowser_1_NewWindow(object sender, CancelEventArgs e)   
  2. {   
  3.     WebBrowser webBrowser_temp = (WebBrowser)sender;   
  4.     string newUrl = webBrowser_temp.Document.ActiveElement.GetAttribute("href");   
  5.     webBrowser_1.Url = new Uri(newUrl);   
  6.     e.Cancel = true;   
  7. }  

虽然这种方法能够解决大部分的要求,但是治标不治本。
而且当网址里面还有汉字的时候就更加麻烦了,比如在百度MP3,歌曲名字都是汉字,和百度空间里面,大部分用户名都是汉字,所以取的网址都用乱码。虽然,可以对网址进行编码,但是并不是所有网页都是uft-8编码,对于如何得知网页的编码又是一个课题了。

最根本的方法就是重写了。
新建一个类

  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Text;   
  4.   
  5. namespace webTestRecorder   
  6. {   
  7.   
  8.     public class ExtendedWebBrowser : System.Windows.Forms.WebBrowser   
  9.     {   
  10.         System.Windows.Forms.AxHost.ConnectionPointCookie cookie;   
  11.         WebBrowserExtendedEvents events;   
  12.   
  13.         //This method will be called to give you a chance to create your own event sink   
  14.         protected override void CreateSink()   
  15.         {   
  16.             //MAKE SURE TO CALL THE BASE or the normal events won't fire   
  17.             base.CreateSink();   
  18.             events = new WebBrowserExtendedEvents(this);   
  19.             cookie = new System.Windows.Forms.AxHost.ConnectionPointCookie(this.ActiveXInstance, events, typeof(DWebBrowserEvents2));   
  20.         }   
  21.   
  22.         protected override void DetachSink()   
  23.         {   
  24.             if (null != cookie)   
  25.             {   
  26.                 cookie.Disconnect();   
  27.                 cookie = null;   
  28.             }   
  29.             base.DetachSink();   
  30.         }   
  31.   
  32.         //This new event will fire when the page is navigating   
  33.         public event EventHandler<WebBrowserExtendedNavigatingEventArgs> BeforeNavigate;   
  34.         public event EventHandler<WebBrowserExtendedNavigatingEventArgs> BeforeNewWindow;   
  35.   
  36.         protected void OnBeforeNewWindow(string url, out bool cancel)   
  37.         {   
  38.             EventHandler<WebBrowserExtendedNavigatingEventArgs> h = BeforeNewWindow;   
  39.             WebBrowserExtendedNavigatingEventArgs args = new WebBrowserExtendedNavigatingEventArgs(url, null);   
  40.             if (null != h)   
  41.             {   
  42.                 h(this, args);   
  43.             }   
  44.             cancel = args.Cancel;   
  45.         }   
  46.   
  47.         protected void OnBeforeNavigate(string url, string frame, out bool cancel)   
  48.         {   
  49.             EventHandler<WebBrowserExtendedNavigatingEventArgs> h = BeforeNavigate;   
  50.             WebBrowserExtendedNavigatingEventArgs args = new WebBrowserExtendedNavigatingEventArgs(url, frame);   
  51.             if (null != h)   
  52.             {   
  53.                 h(this, args);   
  54.             }   
  55.             //Pass the cancellation chosen back out to the events   
  56.             cancel = args.Cancel;   
  57.         }   
  58.         //This class will capture events from the WebBrowser   
  59.         class WebBrowserExtendedEvents : System.Runtime.InteropServices.StandardOleMarshalObject, DWebBrowserEvents2   
  60.         {   
  61.             ExtendedWebBrowser _Browser;   
  62.             public WebBrowserExtendedEvents(ExtendedWebBrowser browser) { _Browser = browser; }   
  63.   
  64.             //Implement whichever events you wish   
  65.             public void BeforeNavigate2(object pDisp, ref object URL, ref object flags, ref object targetFrameName, ref object postData, ref object headers, ref bool cancel)   
  66.             {   
  67.                 _Browser.OnBeforeNavigate((string)URL, (string)targetFrameName, out cancel);   
  68.             }   
  69.   
  70.             public void NewWindow3(object pDisp, ref bool cancel, ref object flags, ref object URLContext, ref object URL)   
  71.             {   
  72.                 _Browser.OnBeforeNewWindow((string)URL, out cancel);   
  73.             }   
  74.   
  75.         }   
  76.         [System.Runtime.InteropServices.ComImport(), System.Runtime.InteropServices.Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"),   
  77.         System.Runtime.InteropServices.InterfaceTypeAttribute(System.Runtime.InteropServices.ComInterfaceType.InterfaceIsIDispatch),   
  78.         System.Runtime.InteropServices.TypeLibType(System.Runtime.InteropServices.TypeLibTypeFlags.FHidden)]   
  79.         public interface DWebBrowserEvents2   
  80.         {   
  81.   
  82.             [System.Runtime.InteropServices.DispId(250)]   
  83.             void BeforeNavigate2(   
  84.                 [System.Runtime.InteropServices.In,   
  85.                 System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.IDispatch)] object pDisp,   
  86.                 [System.Runtime.InteropServices.In] ref object URL,   
  87.                 [System.Runtime.InteropServices.In] ref object flags,   
  88.                 [System.Runtime.InteropServices.In] ref object targetFrameName, [System.Runtime.InteropServices.In] ref object postData,   
  89.                 [System.Runtime.InteropServices.In] ref object headers,   
  90.                 [System.Runtime.InteropServices.In,   
  91.                 System.Runtime.InteropServices.Out] ref bool cancel);   
  92.             [System.Runtime.InteropServices.DispId(273)]   
  93.             void NewWindow3(   
  94.                 [System.Runtime.InteropServices.In,   
  95.                 System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.IDispatch)] object pDisp,   
  96.                 [System.Runtime.InteropServices.In, System.Runtime.InteropServices.Out] ref bool cancel,   
  97.                 [System.Runtime.InteropServices.In] ref object flags,   
  98.                 [System.Runtime.InteropServices.In] ref object URLContext,   
  99.                 [System.Runtime.InteropServices.In] ref object URL);   
  100.   
  101.         }   
  102.     }   
  103.   
  104.     public class WebBrowserExtendedNavigatingEventArgs : System.ComponentModel.CancelEventArgs   
  105.     {   
  106.         private string _Url;   
  107.         public string Url   
  108.         {   
  109.             get { return _Url; }   
  110.         }   
  111.   
  112.         private string _Frame;   
  113.         public string Frame   
  114.         {   
  115.             get { return _Frame; }   
  116.         }   
  117.   
  118.         public WebBrowserExtendedNavigatingEventArgs(string url, string frame)   
  119.             : base()   
  120.         {   
  121.             _Url = url;   
  122.             _Frame = frame;   
  123.         }   
  124.     }   
  125. }  

 

然后把webBrowser换成我们重写的ExtendedWebBrowser,添加事件处理

  1. ieBrowser = new ExtendedWebBrowser();   
  2. ieBrowser.BeforeNewWindow += new EventHandler<WebBrowserExtendedNavigatingEventArgs>(ieBrowser_BeforeNewWindow);  

然后在其BeforeNewWindow事件中:

  1. void ieBrowser_BeforeNewWindow(object sender, WebBrowserExtendedNavigatingEventArgs e)   
  2. {   
  3.      e.Cancel=true;   
  4.      ((ExtendedWebBrowser)sender).Navigate(e.Url);   
  5. }   
原创粉丝点击