Pregunta

Estoy ocupado escribiendo un BHO (objeto ayudante del navegador) en C# y necesito adjuntar a los manejadores de eventos a todos los eventos de entrada en elementos de entrada. No estoy utilizando el WebBrowser incorporado proporcionado por Visual Studio, sino que estoy lanzando una nueva instancia de Internet Explorer instalada en la PC de los clientes. El problema entra cuando se usa diferentes versiones de IE.

En IE7 e IE8 puedo hacerlo así:

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);
      }
    }
  }
}

Eso funciona perfectamente, la cosa es que IE6 arroja un error al lanzar a HtmlinputElementClass, por lo que se ve obligado a lanzar a disftmlinputelement:

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
      }
    }
  }
}

El problema es que no puedo encontrar una manera de adjuntar el evento al objeto disftmlinputelement. ¿Algunas ideas?

¿Fue útil?

Solución

Por lo tanto, resulta que una vez que se haya lanzado desde un sistema System_ComObject a un objeto disftmlinputelement, puede interactuar con la interfaz MSHTML. [Eventos]. Entonces, el código para agregar un controlador de eventos para IE6 será:

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);
      }
    }
  }
 }

Sin embargo, puede interactuar directamente en el controlador de eventos, pero quería excluir algunos tipos como Passwaord y Text Fields, por lo tanto, tuve que lanzar primero a disftmlinputelement.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top