【问题标题】:How to access missing/hidden HTMLDocumentEvents4 events (onchange event) or attach event listeners to element如何访问丢失/隐藏的 HTMLDocumentEvents4 事件(onchange 事件)或将事件侦听器附加到元素
【发布时间】:2014-12-12 13:34:43
【问题描述】:

在 MSHTML 界面中的 HTMLDocumentEvents4 应该包含大约 30 个事件 (根据msdn页面http://msdn.microsoft.com/en-us/library/ff976251(v=vs.85).aspx#events) 但只有 onmssitemodejumplistitemremoved 和 onmsthumbnailclick 可用我想访问其他事件..尤其是更改事件.. 如何访问那些其他事件

using System.Runtime.InteropServices;
namespace MSHTML
{
 [ComVisible(false)]
 [TypeLibType(TypeLibTypeFlags.FHidden)]
 public interface HTMLDocumentEvents4_Event
 {
     event HTMLDocumentEvents4_onmssitemodejumplistitemremovedEventHandler onmssitemodejumplistitemremoved;
     event HTMLDocumentEvents4_onmsthumbnailclickEventHandler onmsthumbnailclick;
 }
}

在我的代码中,我尝试如下访问,但它不起作用(未分配侦听器)

//Event handler class
public delegate void DHTMLEvent(IHTMLEventObj e);

[ComVisible(true)]
public class DHTMLEventHandler
{

    public DHTMLEvent Handler;
    HTMLDocument Document;

    public DHTMLEventHandler(HTMLDocument doc)
    {
        this.Document = doc;
    }
    [DispId(0)]
    public void Call()
    {
        Handler(Document.parentWindow.@event);
    }


}

    //My code
        HTMLDocumentEvents2_Event Events = (HTMLDocumentEvents2_Event)document;
        Events.onclick += new HTMLDocumentEvents2_onclickEventHandler(Events_onclick);//working

         HTMLDocumentEvents4_Event Events2 = (HTMLDocumentEvents4_Event)document;
    //   Events2.change ->Not availabe so  as a workaround I did the below but that is also not      //     working

        DHTMLEventHandler onchangeHandler = new DHTMLEventHandler(document);
        onchangeHandler.Handler += new DHTMLEvent(Events_onchange);
        document.attachEvent("onchange", onchangeHandler);  //Not working
        document.onchange = onchangeHandler;                //Not Working

     private void Events_onchange(IHTMLEventObj e)
    {
        //I want to do my operation here but this is not called as listener is not assigned
    }

     private Boolean Events_onclick(IHTMLEventObj e)
    {
      //working perfectly 
     }

所以我想通过自定义方法或使用 HTMLDocumentEvents4 接口的隐藏事件来监听 onchange 事件..帮帮我

【问题讨论】:

    标签: c# internet-explorer bho mshtml ieaddon


    【解决方案1】:

    我得到了一个解决方法,如何将事件侦听器附加到元素
    1.创建 HTMLHandlerClass 用于将事件处理程序附加到元素
    2.从文档中获取所有元素或要为其附加监听器的元素
    3.cast元素为IHTMLElement2
    4.通过调用 element.attachEvent

    附加事件监听器 第 1 步

    using MSHTML;
    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    
    namespace IEToolbarEngine
    {
    class HtmlHandler : IReflect
    {
        public HtmlHandler(EventHandler evHandler, IHTMLWindow2 sourceWindow)
        {
            this.eventHandler = evHandler;
            this.htmlWindow = sourceWindow;
        }
    
        public IHTMLWindow2 SourceHTMLWindow
        {
            get { return this.htmlWindow; }
        }
    
        #region IReflect
    
        FieldInfo IReflect.GetField(string name, BindingFlags bindingAttr)
        {
            return this.typeIReflectImplementation.GetField(name, bindingAttr);
        }
    
        FieldInfo[] IReflect.GetFields(BindingFlags bindingAttr)
        {
            return this.typeIReflectImplementation.GetFields(bindingAttr);
        }
    
        MemberInfo[] IReflect.GetMember(string name, BindingFlags bindingAttr)
        {
            return this.typeIReflectImplementation.GetMember(name, bindingAttr);
        }
    
        MemberInfo[] IReflect.GetMembers(BindingFlags bindingAttr)
        {
            return this.typeIReflectImplementation.GetMembers(bindingAttr);
        }
    
        MethodInfo IReflect.GetMethod(string name, BindingFlags bindingAttr)
        {
            return this.typeIReflectImplementation.GetMethod(name, bindingAttr);
        }
    
        MethodInfo IReflect.GetMethod(string name, BindingFlags bindingAttr, Binder binder, Type[] types, ParameterModifier[] modifiers)
        {
            return this.typeIReflectImplementation.GetMethod(name, bindingAttr, binder, types, modifiers);
        }
    
        MethodInfo[] IReflect.GetMethods(BindingFlags bindingAttr)
        {
            return this.typeIReflectImplementation.GetMethods(bindingAttr);
        }
    
        PropertyInfo[] IReflect.GetProperties(BindingFlags bindingAttr)
        {
            return this.typeIReflectImplementation.GetProperties(bindingAttr);
        }
    
        PropertyInfo IReflect.GetProperty(string name, BindingFlags bindingAttr)
        {
            return this.typeIReflectImplementation.GetProperty(name, bindingAttr);
        }
    
        PropertyInfo IReflect.GetProperty(string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers)
        {
            return this.typeIReflectImplementation.GetProperty(name, bindingAttr, binder, returnType, types, modifiers);
        }
    
        object IReflect.InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters)
        {
            if (name == "[DISPID=0]")
            {
                if (this.eventHandler != null)
                {
                    this.eventHandler(this, EventArgs.Empty);
                }
            }
    
            return null;
        }
    
        Type IReflect.UnderlyingSystemType
        {
            get
            {
                return this.typeIReflectImplementation.UnderlyingSystemType;
            }
        }
    
        #endregion
    
    
        private IReflect typeIReflectImplementation = typeof(HtmlHandler);
        private EventHandler eventHandler;
        private IHTMLWindow2 htmlWindow;
    }
    }
    

    第 2 步
    在这里,我获取了所有输入元素,因为我想附加 onchange 事件侦听器

     private void attachOnChangeEvent(HTMLDocument doc, Boolean flag)
        {
            // Install onchange for <input type=password, text, file>.
    
            IHTMLElementCollection inputElementList = doc.getElementsByTagName("input");
            foreach (IHTMLElement el in inputElementList)
            {
                String inputType = el.getAttribute("type") as String;
                if (("text" == inputType) || ("password" == inputType) || ("file" == inputType))
                {
                    IHTMLElement2 inputElement = el as IHTMLElement2;
                    IHTMLWindow2 wnd = (el.document as IHTMLDocument2).parentWindow;
                    inputElement.attachEvent("onchange", new HtmlHandler(onchangeInput, wnd));
    
                }
    
            }
       }
    
    
      private void onchangeInput(object sender, EventArgs e)
        {
            HtmlHandler htmlHandler = (HtmlHandler)sender;
            IHTMLElement element = htmlHandler.SourceHTMLWindow.@event.srcElement;
    
          //Do whatever i want with the element
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多