zoukankan      html  css  js  c++  java
  • 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");
       
    }
    }
     

  • 相关阅读:
    mexHttpBinding协议 【发布元数据终结点】
    Revit API创建一个拷贝房间内对象布局命令
    Revit API判断是不是柱族模板
    Revit API封装一个通用函数“过名称找元素”
    Revit手工创建族
    Revit API根据参数类型取得参数的值
    Revit Family API 创建参考平面
    Revit Family API 添加参数与尺寸标注
    osgearth earth文件规范-符号参考
    Revit API创建几何实体Solid并找到与之相交的元素
  • 原文地址:https://www.cnblogs.com/yeye518/p/2802988.html
Copyright © 2011-2022 走看看