在WebBrowser中截获弹出对话框内容并将其屏蔽

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            MyWebBrowser1.WBDocHostShowUIShowMessage += new MyWebBrowser.DocHostShowUIShowMessageEventHandler(MyWebBrowser1_WBDocHostShowUIShowMessage);
        }
        MyWebBrowser MyWebBrowser1 = new MyWebBrowser();
        private void Form1_Load(object sender, EventArgs e)
        {
            this.Controls.Add(MyWebBrowser1);
            MyWebBrowser1.Visible = true;
            MyWebBrowser1.Navigate("about:blank");
            MyWebBrowser1.Document.Write("<mce:script type="text/<a href="http://lib.csdn.net/base/javascript" class='replace_word' title="JavaScript知识库" target='_blank' style='color:#df3434; font-weight:bold;'>JavaScript</a>"><!--
alert('我就是确定按钮啊')
// --></mce:script>");
        }
        void MyWebBrowser1_WBDocHostShowUIShowMessage(object sender, ExtendedBrowserMessageEventArgs e)
        {
            e.Cancel = true;//屏蔽弹出,自行处理
            if (MessageBox.Show("是否要屏蔽Alert对话框", "提示", MessageBoxButtons.YesNo) == DialogResult.No)
            {
                MessageBox.Show(e.Text, e.Caption);
            }
        }
    }
    public class MyWebBrowser : WebBrowser
    {
        //委托、事件
        public delegate void DocHostShowUIShowMessageEventHandler(object sender, ExtendedBrowserMessageEventArgs e);
        public event DocHostShowUIShowMessageEventHandler WBDocHostShowUIShowMessage = null;
        
        #region ExtendedWebBrowserSite
        class ExtendedWebBrowserSite : WebBrowser.WebBrowserSite, UnsafeNativeMethods.IDocHostShowUI
        {
            private MyWebBrowser _Browser;
            public ExtendedWebBrowserSite(MyWebBrowser host)
                : base(host)
            {
                _Browser = host;
            }
            int UnsafeNativeMethods.IDocHostShowUI.ShowMessage(IntPtr hwnd, string lpstrText,
                            string lpstrCaption, uint dwType,
                            string lpstrHelpFile, uint dwHelpContext, ref int lpResult) 
            {
                int iRet = 1;  //Hresults.S_FALSE
                if (_Browser.WBDocHostShowUIShowMessage != null)
                {
                    ExtendedBrowserMessageEventArgs args = new ExtendedBrowserMessageEventArgs(hwnd, lpstrText, lpstrCaption, dwType, lpstrHelpFile, dwHelpContext);
                    _Browser.WBDocHostShowUIShowMessage(this, args);
                    if (args.Cancel == true)
                    {
 
                        iRet = 0;//Hresults.S_OK;  
                        lpResult = args.pResult;
                    }
                }
                return iRet;
            }
            int UnsafeNativeMethods.IDocHostShowUI.ShowHelp(IntPtr hwnd, string pszHelpFile, uint uCommand, uint dwData, UnsafeNativeMethods.tagPOINT ptMouse, object pDispatchObjectHit)
            {
                return unchecked((int)0x80004001);//Hresults.E_NOTIMPL
            }
        }
        protected override WebBrowserSiteBase CreateWebBrowserSiteBase()
        {
            return new ExtendedWebBrowserSite(this);
        }
        #endregion
    }
    public class UnsafeNativeMethods
    {
        #region IDocHostShowUI
        [StructLayout(LayoutKind.Explicit, Pack = 4)]
        public struct __MIDL_IWinTypes_0009
        {
            // Fields 
            [FieldOffset(0)]
            public int hInproc;
            [FieldOffset(0)]
            public int hRemote;
        }
        [StructLayout(LayoutKind.Sequential, Pack = 4)]
        public struct _RemotableHandle
        {
            public int fContext;
            public __MIDL_IWinTypes_0009 u;
        }
        [StructLayout(LayoutKind.Sequential, Pack = 4)]
        public struct tagPOINT
        {
            public int x;
            public int y;
        }
        [ComImport, ComVisible(true)]
        [Guid("C4D244B0-D43E-11CF-893B-00AA00BDCE1A")]
        [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        public interface IDocHostShowUI
        {
            [return: MarshalAs(UnmanagedType.I4)]
            [PreserveSig]
            int ShowMessage(
                IntPtr hwnd,
                [MarshalAs(UnmanagedType.LPWStr)] string lpstrText,
                [MarshalAs(UnmanagedType.LPWStr)] string lpstrCaption,
                [MarshalAs(UnmanagedType.U4)] uint dwType,
                [MarshalAs(UnmanagedType.LPWStr)] string lpstrHelpFile,
                [MarshalAs(UnmanagedType.U4)] uint dwHelpContext,
                [In, Out] ref int lpResult);
            [return: MarshalAs(UnmanagedType.I4)]
            [PreserveSig]
            int ShowHelp(
                IntPtr hwnd,
                [MarshalAs(UnmanagedType.LPWStr)] string pszHelpFile,
                [MarshalAs(UnmanagedType.U4)] uint uCommand,
                [MarshalAs(UnmanagedType.U4)] uint dwData,
                [In, MarshalAs(UnmanagedType.Struct)] tagPOINT ptMouse,
                [Out, MarshalAs(UnmanagedType.IDispatch)] object pDispatchObjectHit);
        }  
        #endregion
    }
    #region ExtendedBrowserMessageEventArgs
    public class ExtendedBrowserMessageEventArgs : CancelEventArgs
    {
        private int _plResult;
        public int pResult
        {
            get { return _plResult; }
        }
        public System.Windows.Forms.DialogResult DlgResult
        {
            set { _plResult = (int)value; }
        }
        private IntPtr _hwnd;
        public IntPtr hwnd
        {
            get { return _hwnd; }
        }
        private string _lpstrText;
        public string Text
        {
            get { return _lpstrText; }
        }
        private string _lpstrCaption;
        public string Caption
        {
            get { return _lpstrCaption; }
        }
        private uint _dwType;
        public System.Windows.Forms.MessageBoxButtons DlgButtons
        {
            get
            {
                switch (_dwType & (int)MsgBoxButton.MASK)
                {
                    case (int)MsgBoxButton.MB_OKCANCEL:
                        return System.Windows.Forms.MessageBoxButtons.OKCancel;
                    case (int)MsgBoxButton.MB_ABORTRETRYIGNORE:
                        return System.Windows.Forms.MessageBoxButtons.AbortRetryIgnore;
                    case (int)MsgBoxButton.MB_YESNOCANCEL:
                        return System.Windows.Forms.MessageBoxButtons.YesNoCancel;
                    case (int)MsgBoxButton.MB_YESNO:
                        return System.Windows.Forms.MessageBoxButtons.YesNo;
                    case (int)MsgBoxButton.MB_RETRYCANCEL:
                        return System.Windows.Forms.MessageBoxButtons.RetryCancel;
                    case (int)MsgBoxButton.MB_OK:
                    default:
                        return System.Windows.Forms.MessageBoxButtons.OK;
                }
            }
        }
        public System.Windows.Forms.MessageBoxIcon DlgIcon
        {
            get
            {
                switch (_dwType & (int)MsgBoxIcon.MASK)
                {
                    case (int)MsgBoxIcon.MB_ICONHAND:
                        return System.Windows.Forms.MessageBoxIcon.Hand;
                    case (int)MsgBoxIcon.MB_ICONQUESTION:
                        return System.Windows.Forms.MessageBoxIcon.Question;
                    case (int)MsgBoxIcon.MB_ICONEXCLAMATION:
                        return System.Windows.Forms.MessageBoxIcon.Exclamation;  
                    case (int)MsgBoxIcon.MB_ICONASTERISK:
                        return System.Windows.Forms.MessageBoxIcon.Asterisk;
                    case (int)MsgBoxIcon.MB_ICONNONE:
                    case (int)MsgBoxIcon.MB_USERICON:
                    default:
                        return System.Windows.Forms.MessageBoxIcon.None;
                }
            }
        }
        public System.Windows.Forms.MessageBoxDefaultButton DlgDefaultButtons
        {
            get
            {
                switch (_dwType & (int)MsgBoxDefButton.MASK)
                {
                    case (int)MsgBoxDefButton.MB_DEFBUTTON2:
                        return System.Windows.Forms.MessageBoxDefaultButton.Button2;
                    case (int)MsgBoxDefButton.MB_DEFBUTTON3:
                        return System.Windows.Forms.MessageBoxDefaultButton.Button3;
                    case (int)MsgBoxDefButton.MB_DEFBUTTON1:
                    default:
                        return System.Windows.Forms.MessageBoxDefaultButton.Button1;
                }
            }
        }
        public System.Windows.Forms.MessageBoxOptions DlgOptions
        {
            get
            {
                switch (_dwType & (int)MsgBoxOption.MASK)
                {
                    case (int)MsgBoxOption.MB_DEFAULT_DESKTOP_ONLY:
                        return System.Windows.Forms.MessageBoxOptions.DefaultDesktopOnly;
                    case (int)MsgBoxOption.MB_RIGHT:
                        return System.Windows.Forms.MessageBoxOptions.RightAlign;
                    case (int)MsgBoxOption.MB_RTLREADING:
                        return System.Windows.Forms.MessageBoxOptions.RtlReading;
                    case (int)MsgBoxOption.MB_SERVICE_NOTIFICATION1:
                    case (int)MsgBoxOption.MB_SERVICE_NOTIFICATION2:
                        return System.Windows.Forms.MessageBoxOptions.ServiceNotification;
                    default:
                        return 0;
                }
            }
        }
        public bool displayHelpButton
        {
            get { return (_dwType & (int)MsgBoxHelpButton.MASK) == (int)MsgBoxHelpButton.MB_HELP; }
        }
        private string _lpstrHelpFile;
        public string lpstrHelpFile
        {
            get { return _lpstrHelpFile; }
        }
        private uint _dwHelpContext;
        public uint dwHelpContext
        {
            get { return _dwHelpContext; }
        }
        public ExtendedBrowserMessageEventArgs(IntPtr Hwnd, string LpstrText, string LpstrCaption, uint DwType, string LpstrHelpFile, uint DwHelpContext)
            : base()
        {
            this._hwnd = Hwnd;
            _lpstrText = LpstrText;
            _lpstrCaption = LpstrCaption;
            _dwType = DwType;
            _lpstrHelpFile = LpstrHelpFile;
            _dwHelpContext = DwHelpContext;
            switch (DlgButtons)
            {
                case System.Windows.Forms.MessageBoxButtons.OKCancel:
                case System.Windows.Forms.MessageBoxButtons.RetryCancel:
                case System.Windows.Forms.MessageBoxButtons.YesNoCancel:
                    DlgResult = System.Windows.Forms.DialogResult.Cancel;
                    break;
                case System.Windows.Forms.MessageBoxButtons.YesNo:
                    DlgResult = System.Windows.Forms.DialogResult.No;
                    break;
                case System.Windows.Forms.MessageBoxButtons.AbortRetryIgnore:
                    DlgResult = System.Windows.Forms.DialogResult.Abort;
                    break;
                case System.Windows.Forms.MessageBoxButtons.OK:
                default:
                    DlgResult = System.Windows.Forms.DialogResult.OK;
                    break;
            }
        }
    }
    public enum MsgBoxButton
    {
        MASK = 0x0000000F,
        MB_OK = 0x00000000,
        MB_OKCANCEL = 0x00000001,
        MB_ABORTRETRYIGNORE = 0x00000002,
        MB_YESNOCANCEL = 0x00000003,
        MB_YESNO = 0x00000004,
        MB_RETRYCANCEL = 0x00000005
    }
    public enum MsgBoxIcon
    {
        MASK = 0x000000F0,
        MB_ICONNONE = 0x00000000,
        MB_ICONHAND = 0x00000010,
        MB_ICONSTOP = 0x00000010,
        MB_ICONERROR = 0x00000010,
        MB_ICONQUESTION = 0x00000020,
        MB_ICONEXCLAMATION = 0x00000030,
        MB_ICONWARNING = 0x00000030,
        MB_ICONASTERISK = 0x00000040,
        MB_ICONINFORMATION = 0x00000040,
        MB_USERICON = 0x00000080
    }
    public enum MsgBoxDefButton
    {
        MASK = 0x00000F00,
        MB_DEFBUTTON1 = 0x00000000,
        MB_DEFBUTTON2 = 0x00000100,
        MB_DEFBUTTON3 = 0x00000200
    }
    public enum MsgBoxOption
    {
        MASK = 0x003F0000,
        MB_DEFAULT_DESKTOP_ONLY = 0x00020000,
        MB_RIGHT = 0x00080000,
        MB_RTLREADING = 0x00100000,
        MB_SERVICE_NOTIFICATION1 = 0x00200000,
        MB_SERVICE_NOTIFICATION2 = 0x00040000
    }
    public enum MsgBoxHelpButton
    {
        MASK = 0x00004000,
        MB_HELP = 0x00004000
    }
    #endregion  
}

  v

原文地址:https://www.cnblogs.com/XuPengLB/p/5977012.html