Question

Je suis occupé à écrire un BHO (Browser Helper Object) en C # et j'ai besoin d'attacher des gestionnaires d'événements à tous les événements ANCLICK sur les éléments d'entrée. Je n'utilise pas le webbrowser intégré fourni par Visual Studio, mais je lance une nouvelle instance d'Internet Explorer installé sur le PC des clients. Le problème arrive lors de l'utilisation de différentes versions de IE.

Dans IE7 et IE8, je peux le faire comme ceci:

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

Cela fonctionne parfaitement, le fait est que IE6 lance une erreur lors du casting sur HTMLinPutelElementClass, vous êtes donc obligé de lancer à DisphtMlinPutellement:

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

Le problème est que je ne semble pas trouver un moyen d'attacher l'événement à l'objet DisphTMLinPutellement. Des idées?

Était-ce utile?

La solution

Il s'avère donc qu'une fois que vous avez coulé d'un System_ComObject à un objet DisphTMLinPutellement, vous pouvez interagir avec l'interface MSHTML. [Événements]. Ainsi, le code pour ajouter un gestionnaire d'événements pour IE6 sera:

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

Vous pouvez cependant vous interface directement dans le gestionnaire d'événements, mais je voulais exclure certains types comme Passwaord et Text Fields, donc j'ai dû lancer pour disshippertelverment d'abord

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top