zoukankan      html  css  js  c++  java
  • 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 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);
            }
        }
        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上的代码示例,有的放矢:

    private void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        ((WebBrowser)sender).Document.Window.Error += new HtmlElementErrorEventHandler(Window_Error);
    }
    private void Window_Error(object sender, HtmlElementErrorEventArgs e)
    {
        // Ignore the error and suppress the error dialog box. 
        e.Handled = true;
    }
    

      五,在ExtendedWebBrowser的事件里双击“BeforeNewWindow”并添加代码:

              private void extendedWebBrowser2_BeforeNewWindow(object sender, EventArgs e)
            {
               
        
                WebBrowserExtendedNavigatingEventArgs eventArgs = e as WebBrowserExtendedNavigatingEventArgs;
         
                eventArgs.Cancel = true;
                ((ExtendedWebBrowser)sender).Navigate(eventArgs.Url);
            }
    

      

  • 相关阅读:
    mysql replication常见错误整理
    enq: TX
    LOGMNR分析redo log和archive log教程
    使用create datafile... as ...迁移数据文件到裸设备
    mysql无法启动,报错 Can't start server: can't create PID file: No space left on device
    MYSQL 权限设置查询
    ORA-02437 违反主键
    oracle sequence的用法
    sequence有关问题
    关于Relay Log无法自动删除的问题
  • 原文地址:https://www.cnblogs.com/soundcode/p/13689579.html
Copyright © 2011-2022 走看看