C#封装WebBrowser时NewWindow事件无法获取Url的解决方法
生活随笔
收集整理的這篇文章主要介紹了
C#封装WebBrowser时NewWindow事件无法获取Url的解决方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一,重寫WebBrowser組件,禁止跳轉到IE新窗口。菜單“項目->添加類”,在模板中的“類”圖標上確認一下,然后名稱改為“ExtendedWebBrowser.cs”。?
二,在右邊解決方案管理器中右擊“查看代碼”,然后在ExtendedWebBrowser.cs代碼窗口將代碼修改成如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyBrowser {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 sinkprotected override void CreateSink(){//MAKE SURE TO CALL THE BASE or the normal events won't firebase.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 navigatingpublic 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 eventscancel = args.Cancel;}//This class will capture events from the WebBrowserclass WebBrowserExtendedEvents : System.Runtime.InteropServices.StandardOleMarshalObject, DWebBrowserEvents2{ExtendedWebBrowser _Browser;public WebBrowserExtendedEvents(ExtendedWebBrowser browser) { _Browser = browser; }//Implement whichever events you wishpublic 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);}}public class WebBrowserExtendedNavigatingEventArgs : System.ComponentModel.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;}} } 三,回到Form1.cs[設計]窗口,在菜單“生成”中,點“生成解決方案”。一會之后在工具箱的最上方就會出現一個新的組件“ExtendedWebBrowser”,這正是我們需要的,hehe。
?四、回到Form1.cs[設計]窗口,把ExtendedWebBrowser拖進來。
??? (一)在屬性窗口里調整好Anchor,使之能最大化。
??? (二)雙擊“ScriptErrorSuppressed”,將之屬性改為“True”以禁用所有的對話框,比如提示Activex下載、執行以及安全登錄等對話框。當然可以參考MSDN上的代碼示例,有的放矢:
五,在ExtendedWebBrowser的事件里雙擊“BeforeNewWindow”并添加代碼:
private void extendedWebBrowser2_BeforeNewWindow(object sender, EventArgs e){WebBrowserExtendedNavigatingEventArgs eventArgs = e as WebBrowserExtendedNavigatingEventArgs;eventArgs.Cancel = true;((ExtendedWebBrowser)sender).Navigate(eventArgs.Url);}總結
以上是生活随笔為你收集整理的C#封装WebBrowser时NewWindow事件无法获取Url的解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。