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

进行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. }   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值