Прикрепите обработчик событий к mshtml.DispHTMLInputElement

Я занят написанием BHO (объект помощника браузера) на С#, и мне нужно прикрепить обработчики событий ко всем событиям onclick на элементах ввода. Я НЕ использую встроенный веб-браузер, предоставленный Visual Studio, вместо этого я запускаю новый экземпляр Internet Explorer, установленный на клиентском ПК. Проблема возникает при использовании разных версий IE.

В IE7 и IE8 я могу сделать это так:

public void attachEventHandler(HTMLDocument doc)
{
  IHTMLElementCollection els = doc.all;
  foreach (IHTMLElement el in els)
  {
    if(el.tagName == "INPUT")
    {
      HTMLInputElementClass inputElement = el as HTMLInputElementClass;
      if (inputElement.IHTMLInputElement_type != "text" && InputElement.IHTMLInputElement_type != "password")
      {
        inputElement.HTMLButtonElementEvents_Event_onclick += new HTMLButtonElementEvents_onclickEventHandler(buttonElement_HTMLButtonElementEvents_Event_onclick);
      }
    }
  }
}

Это отлично работает, дело в том, что IE6 выдает ошибку при приведении к HTMLInputElementClass, поэтому вы вынуждены приводить к DispHTMLInputElement:

public void attachEventHandler(HTMLDocument doc)
{
  IHTMLElementCollection els = doc.all;
  foreach (IHTMLElement el in els)
  {
    if(el.tagName == "INPUT")
    {
      DispHTMLInputElement inputElement = el as DispHTMLInputElement;
      if (inputElement.type != "text" && inputElement.type != "password")
      {
        //attach onclick event handler here
      }
    }
  }
}

Проблема в том, что я не могу найти способ прикрепить событие к объекту DispHTMLInputElement. Любые идеи?


person Yo Momma    schedule 10.12.2009    source источник


Ответы (1)


Получается, что после приведения объекта System_ComObject к объекту DispHTMLInputElement вы можете взаимодействовать с интерфейсом mshtml.[events]. Таким образом, код для добавления обработчика событий для IE6 будет таким:

public void attachEventHandler(HTMLDocument doc)
{
  IHTMLElementCollection els = doc.all;
  foreach (IHTMLElement el in els)
  {
    if(el.tagName == "INPUT")
    {
      DispHTMLInputElement inputElement = el as DispHTMLInputElement;
      if (inputElement.type != "text" && inputElement.type != "password")
      {
        HTMLButtonElementEvents_Event htmlButtonEvent = inputElement as HTMLButtonElementEvents_Event;
        htmlButtonEvent.onclick += new HTMLButtonElementEvents_onclickEventHandler(buttonElement_HTMLButtonElementEvents_Event_onclick);
      }
    }
  }
 }

Однако вы можете напрямую взаимодействовать с обработчиком событий, но я хотел исключить некоторые типы, такие как пароль и текстовые поля, поэтому мне пришлось сначала выполнить приведение к DispHTMLInputElement

person Yo Momma    schedule 11.12.2009
comment
Я должен поблагодарить Yo Momma. Приведение к объекту HTMLButtonElementEvents_Event имело все значение. Потратьте на это часы. - person annoying_squid; 13.07.2018