Question

La documentation MSDN pour addEventListener dit qu'il accepte une fonction de rappel sous la forme d'un IDispatch * objet. De C # (j'utilise COM Interop), Visual Studio affiche le type de paramètre comme juste object.

J'ai cherché un IEventListener Interface ou quelque chose de similaire mais n'en a pas trouvé. Qu'est-ce que je suis censé passer?

Était-ce utile?

La solution

Après quelques recherches, j'ai appris que ces points de connexion COM (gestionnaires d'événements) sont spécifiés avec DispId(0). Les fonctions de rappel sont représentées par des cas de classes comme:

// These attributes may be optional, depending on the project configuration.
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDispatch)]
public class EventListener
{
    [DispId(0)]
    // The "target" parameter is an implementation detail.
    public void NameDoesNotMatter(object target, IDOMEvent evt) { ... }
}

Depuis DispId(0) Spécifie la méthode par défaut à invoquer, le nom réel de la méthode n'a pas d'importance. Cependant, les paramètres de la méthode comptent certainement. Par exemple, IHTMLElement.onclick doit se voir attribuer un rappel sans arguments, tandis que IHTMLElement2.attachEvent prend un rappel avec un paramètre de type IHTMLEventObj (ou IHTMLEventObj2, ..., 6 , ou même juste object).

En résumé, com IDispatch Les rappels peuvent être mis en œuvre en C # en utilisant une classe com-visible avec une méthode qui accepte les arguments corrects et est annoté avec [DispId(0)].


Malgré tout cela, les solutions qui évitent l'API des événements DOM W3C peuvent être plus appropriées, car les objets IE9 DOM ne prennent pas en charge cette méthode lorsque le navigateur utilise un mode de document inférieur pour la compatibilité. Par exemple, une extension qui utilise addEventListener Échouera sur une page comme Bing, qui est rendue en mode IE7.

Il ne semble pas non également possible de définir le mode de document utilisé par un IWebBrowser2 Instance en plus de le faire manuellement via les outils de développeur F12.

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