C#封装WebBrowser时NewWindow事件无法获取Url的解决方法

来源:互联网 发布:泉州旅游数据分析 编辑:程序博客网 时间:2024/06/16 19:10

本文为转载,查看原文请点击 原文链接

重写一个WebBrowser,代码如下,亲测可用

public class WebBrowserExtendedNavigatingEventArgs : 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;        }    }    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 sink        protected override void CreateSink()        {            //MAKE SURE TO CALL THE BASE or the normal events won't fire            base.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 navigating        public 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 events            cancel = args.Cancel;        }        //This class will capture events from the WebBrowser        class WebBrowserExtendedEvents : System.Runtime.InteropServices.StandardOleMarshalObject, DWebBrowserEvents2        {            ExtendedWebBrowser _Browser;            public WebBrowserExtendedEvents(ExtendedWebBrowser browser) { _Browser = browser; }            //Implement whichever events you wish            public 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);        }    }  使用方法:        ExtendedWebBrowser webBrowser;        private void webBrowser_BeforeNavigate(object sender, EventArgs e)        {        }        //增加了这个事件,可以替代原来的NewWindow事件.        private void webBrowser_BeforeNewWindow(object sender, EventArgs e)        {            WebBrowserExtendedNavigatingEventArgs eventArgs = e as WebBrowserExtendedNavigatingEventArgs;            webBrowser.Navigate(eventArgs.Url);            eventArgs.Cancel = true;        }        private void FrmWebBrowser_Load(object sender, EventArgs e)        {            webBrowser.Navigate("http://www.google.com/");        }

0 0