屏蔽WebBrowser对Javascript的错误弹窗【转】

定义IOleCommandTarget接口、OLECMD类:


public static class NativeMethods 
    {
        public enum OLECMDF
        {
            // Fields
            OLECMDF_DEFHIDEONCTXTMENU = 0x20,
            OLECMDF_ENABLED = 2,
            OLECMDF_INVISIBLE = 0x10,
            OLECMDF_LATCHED = 4,
            OLECMDF_NINCHED = 8,
            OLECMDF_SUPPORTED = 1
        }


        public enum OLECMDID
        {
            // Fields
            OLECMDID_PAGESETUP = 8,
            OLECMDID_PRINT = 6,
            OLECMDID_PRINTPREVIEW = 7,
            OLECMDID_PROPERTIES = 10,
            OLECMDID_SAVEAS = 4,
            OLECMDID_SHOWSCRIPTERROR = 40
        }
        public enum OLECMDEXECOPT
        {
            // Fields
            OLECMDEXECOPT_DODEFAULT = 0,
            OLECMDEXECOPT_DONTPROMPTUSER = 2,
            OLECMDEXECOPT_PROMPTUSER = 1,
            OLECMDEXECOPT_SHOWHELP = 3
        }


        [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("B722BCCB-4E68-101B-A2BC-00AA00404770"), ComVisible(true)]
        public interface IOleCommandTarget
        {
            [return: MarshalAs(UnmanagedType.I4)]
            [PreserveSig]
            int QueryStatus(ref Guid pguidCmdGroup, int cCmds, [In, Out] NativeMethods.OLECMD prgCmds, [In, Out] IntPtr pCmdText);
            [return: MarshalAs(UnmanagedType.I4)]
            [PreserveSig]
            int Exec(ref Guid pguidCmdGroup, int nCmdID, int nCmdexecopt, [In, MarshalAs(UnmanagedType.LPArray)] object[] pvaIn, ref int pvaOut);
        }


        [StructLayout(LayoutKind.Sequential)]
        public class OLECMD
        {
            [MarshalAs(UnmanagedType.U4)]
            public int cmdID;
            [MarshalAs(UnmanagedType.U4)]
            public int cmdf;
            public OLECMD()
            {
            }
        }


        public const int S_FALSE = 1;
        public const int S_OK = 0;


        public static readonly Guid CGID_DocHostCommandHandler = new Guid("f38bc242-b950-11d1-8918-00c04fc2c836");


        public const int VARIANT_TRUE = -1;
        public const int VARIANT_FALSE = 0;
        public const int OLECMDERR_E_NOTSUPPORTED = -2147221244;




    }


       然后定义一个类ExtendedWebBrowserSite,去实现接口:


class ExtendedWebBrowserSite : WebBrowserSite, NativeMethods.IOleCommandTarget
        {
            /// <summary>
            /// Creates a new instance of the <see cref="ExtendedWebBrowserSite"/> class
            /// </summary>
            /// <param name="host">The <see cref="ExtendedWebBrowser"/> hosting the browser</param>
            public ExtendedWebBrowserSite(ExtendedWebBrowser host)
                : base(host)
            {
                _host = host;
            }




            private ExtendedWebBrowser _host;
            private ExtendedWebBrowser Host
            {
                get
                {
                    return _host;
                }
            }


            #region IOleCommandTarget Members


            int NativeMethods.IOleCommandTarget.QueryStatus(ref Guid pguidCmdGroup, int cCmds, NativeMethods.OLECMD prgCmds, IntPtr pCmdText)
            {
                return NativeMethods.S_FALSE;
            }


            int NativeMethods.IOleCommandTarget.Exec(ref Guid pguidCmdGroup, int nCmdID, int nCmdexecopt, object[] pvaIn, ref int pvaOut)
            {
                int hResult = NativeMethods.S_OK;
                if (pguidCmdGroup == null)
                    return hResult;
                // Check for invalid pointers (or get a NullReferenceException on a value type???)
                //if (NativeMethods.CGID_DocHostCommandHandler.Equals(pguidCmdGroup))
                {
                    switch (nCmdID)
                    {
                        case (int)NativeMethods.OLECMDID.OLECMDID_SHOWSCRIPTERROR:
                            // Hide the dialog
                            pvaOut = NativeMethods.VARIANT_TRUE;




                            break;
                        default:
                            hResult = NativeMethods.OLECMDERR_E_NOTSUPPORTED;
                            break;
                    }
                }
                return hResult;
            }


            #endregion


        }
   } 


    当然这里主要是通过实现IOleCommandTarget.Exec方法去捕获OLECMDID.OLECMDID_SHOWSCRIPTERROR消息,然后避免异常。


      最后在你的扩展的WebBrowser里面重载一下CreateWebBrowserSiteBase方法,完成调用。


        protected override WebBrowserSiteBase CreateWebBrowserSiteBase()
        {
            return new ExtendedWebBrowserSite(this);
        } 


    完成以上操作,就可以完全避免WebBrowser中的JS错误发生。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值