Respuesta

5

Después de algunas investigaciones, me enteré de que estos puntos de conexión COM (controladores de eventos) se especifican con DispId(0). funciones de devolución de llamada están representados por las instancias de clases como:

// 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) { ... } 
} 

Desde DispId(0) especifica el método por defecto para invocar, el nombre real del método no importa. Sin embargo, los parámetros del método ciertamente importan. Por ejemplo, IHTMLElement.onclick debe tener asignada una devolución de llamada sin argumentos, mientras que IHTMLElement2.attachEvent toma una devolución de llamada con un parámetro de tipo IHTMLEventObj (o IHTMLEventObj2, ..., 6, o incluso solo object).

En resumen, las devoluciones de llamadas COM IDispatch se pueden implementar en C# utilizando una clase COM-visible con un método que acepta los argumentos correctos y se anota con [DispId(0)].


pesar de todo esto, las soluciones que eviten la Eventos API W3C DOM puede ser más apropiado, como objetos IE9 DOM no son compatibles con este método cuando el navegador está utilizando un modo de documento inferior para la compatibilidad. Por ejemplo, una extensión que usa addEventListener fallará en una página como Bing, que se representa en modo IE7.

Tampoco parece posible establecer el modo de documento utilizado en una instancia IWebBrowser2, aparte de hacerlo manualmente a través de las herramientas de desarrollador F12.

Cuestiones relacionadas