• webbrowser 实现IOleControl接口2


    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows.Forms;
    using System.Reflection;
    using System.Runtime.InteropServices;
    using System.Globalization;
    namespace GetCode
    {
        public class MyWebBrowser : WebBrowser
        {
            private const int DISPID_AMBIENT_DLCONTROL = -5512;
            private int _downloadControlFlags;

            // we want our site class, not the default one
            protected override WebBrowserSiteBase CreateWebBrowserSiteBase()
            {
                return new MyWebBrowserSite(this);
            }

            [DispId(DISPID_AMBIENT_DLCONTROL)]
            public int DownloadControlFlags
            {
                get
                {
                    return _downloadControlFlags;
                }
                set
                {
                    if (_downloadControlFlags == value)
                        return;

                    _downloadControlFlags = value;
                    IOleControl ctl = (IOleControl)ActiveXInstance;
                    ctl.OnAmbientPropertyChange(DISPID_AMBIENT_DLCONTROL);
                }
            }

            protected class MyWebBrowserSite : WebBrowserSite, IReflect
            {
                private Dictionary<int, PropertyInfo> _dispidCache;
                private MyWebBrowser _host;

                public MyWebBrowserSite(MyWebBrowser host)
                    : base(host)
                {
                    _host = host;
                }

                object IReflect.InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters)
                {
                    object ret = null;
                    // Check direct IDispatch call using a dispid (see http://msdn.microsoft.com/en-us/library/de3dhzwy.aspx)
                    const string dispidToken = "[DISPID=";
                    if (name.StartsWith(dispidToken))
                    {
                        int dispid = int.Parse(name.Substring(dispidToken.Length, name.Length - dispidToken.Length - 1));
                        if (_dispidCache == null)
                        {
                            // WebBrowser has many properties, so we build a dispid cache on it
                            _dispidCache = new Dictionary<int, PropertyInfo>();
                            foreach (PropertyInfo pi in _host.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
                            {
                                if ((!pi.CanRead) || (pi.GetIndexParameters().Length > 0))
                                    continue;

                                object[] atts = pi.GetCustomAttributes(typeof(DispIdAttribute), true);
                                if ((atts != null) && (atts.Length > 0))
                                {
                                    DispIdAttribute da = (DispIdAttribute)atts[0];
                                    _dispidCache[da.Value] = pi;
                                }
                            }
                        }

                        PropertyInfo property;
                        if (_dispidCache.TryGetValue(dispid, out property))
                        {
                            ret = property.GetValue(_host, null);
                        }
                    }
                    return ret;
                }

                FieldInfo[] IReflect.GetFields(BindingFlags bindingAttr)
                {
                    return GetType().GetFields(bindingAttr);
                }

                MethodInfo[] IReflect.GetMethods(BindingFlags bindingAttr)
                {
                    return GetType().GetMethods(bindingAttr);
                }

                PropertyInfo[] IReflect.GetProperties(BindingFlags bindingAttr)
                {
                    return GetType().GetProperties(bindingAttr);
                }

                FieldInfo IReflect.GetField(string name, BindingFlags bindingAttr)
                {
                    throw new NotImplementedException();
                }

                MemberInfo[] IReflect.GetMember(string name, BindingFlags bindingAttr)
                {
                    throw new NotImplementedException();
                }

                MemberInfo[] IReflect.GetMembers(BindingFlags bindingAttr)
                {
                    throw new NotImplementedException();
                }

                MethodInfo IReflect.GetMethod(string name, BindingFlags bindingAttr)
                {
                    throw new NotImplementedException();
                }

                MethodInfo IReflect.GetMethod(string name, BindingFlags bindingAttr, Binder binder, Type[] types, ParameterModifier[] modifiers)
                {
                    throw new NotImplementedException();
                }

                PropertyInfo IReflect.GetProperty(string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers)
                {
                    throw new NotImplementedException();
                }

                PropertyInfo IReflect.GetProperty(string name, BindingFlags bindingAttr)
                {
                    throw new NotImplementedException();
                }

                Type IReflect.UnderlyingSystemType
                {
                    get { throw new NotImplementedException(); }
                }
            }

            [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("B196B288-BAB4-101A-B69C-00AA00341D07")]
            internal interface IOleControl
            {
                void Reserved0();
                void Reserved1();
                void OnAmbientPropertyChange(int dispID);
                void Reserved2();
            }
        }

        [Flags]
        public enum WebBrowserDownloadControlFlags : uint
        {
            DLIMAGES = 0x00000010,
            VIDEOS = 0x00000020,
            BGSOUNDS = 0x00000040,
            NO_SCRIPTS = 0x00000080,
            NO_JAVA = 0x00000100,
            NO_RUNACTIVEXCTLS = 0x00000200,
            NO_DLACTIVEXCTLS = 0x00000400,
            DOWNLOADONLY = 0x00000800,
            NO_FRAMEDOWNLOAD = 0x00001000,
            RESYNCHRONIZE = 0x00002000,
            PRAGMA_NO_CACHE = 0x00004000,
            NO_BEHAVIORS = 0x00008000,
            NO_METACHARSET = 0x00010000,
            URL_ENCODING_DISABLE_UTF8 = 0x00020000,
            URL_ENCODING_ENABLE_UTF8 = 0x00040000,
            NOFRAMES = 0x00080000,
            FORCEOFFLINE = 0x10000000,
            NO_CLIENTPULL = 0x20000000,
            SILENT = 0x40000000,
            OFFLINEIFNOTCONNECTED = 0x80000000,
            OFFLINE = OFFLINEIFNOTCONNECTED,
        }
    }

    调用代码

    public partial class Form1:Form
    {
       
    private MyWebBrowser _webBrowser;

       
    public Form1()
       
    {
           
    InitializeComponent();

            _webBrowser
    =newMyWebBrowser();
            _webBrowser
    .Dock=DockStyle.Fill;

           
    Controls.Add(_webBrowser);
       
    }

       
    private void button1_Click(object sender,EventArgs e)
       
    {
            _webBrowser
    .DownloadControlFlags=(int)WebBrowserDownloadControlFlags.DOWNLOADONLY;
            _webBrowser
    .Navigate("http://mysamplewebsite");
       
    }
    }
     

  • 相关阅读:
    关于Jonathan S. Weissman与RIT(罗切斯特理工学院,位于纽约)
    jQuery获取元素值以及设置元素值总结
    页面跳转
    Node JS复制文件
    js获取当前日期并格式yyy-MM-dd
    Json文件删除元素
    HTML页面间传值
    计算机实用但冷门快捷键
    NodejS---require的机制
    Node某个JS导出方法变量以及在其他地方引用的例子
  • 原文地址:https://www.cnblogs.com/yeye518/p/2802988.html
Copyright © 2020-2023  润新知