如何访问丢失/隐藏的 HTMLDocumentEvents4 事件(onchange 事件)或将事件侦听器附加到元素

本文关键字:事件 onchange 侦听器 元素 访问 何访问 隐藏 HTMLDocumentEvents4 | 更新日期: 2023-09-27 18:33:35

In MSHTML interface 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 事件。帮帮我

如何访问丢失/隐藏的 HTMLDocumentEvents4 事件(onchange 事件)或将事件侦听器附加到元素

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

事件侦听器 步骤 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
    }