¿Cómo puedo hacer que un control ActiveX escrito con C # levante eventos en JavaScript cuando se hace clic?

Ya veo algunas preguntas relacionadas con esto en SO, pero creo que el mío es lo suficientemente diferente como para no ser considerado un duplicado (si me equivoco, házmelo saber).

Tengo un control ActiveX que he escrito en C # y, aunque lo tengo funcionando en su mayoría, quiero plantear un evento en JavaScript cuando se hace clic (muestra una imagen por lo que es un elemento visual en la página).

El objective final de lo que estoy buscando lograr no es diferente de si fuera una etiqueta y tuviera un evento onclick para generar una función de JavaScript cuando se hiciera clic en el área de la etiqueta.

La mayoría de las cosas que he leído contienen detalles muy detallados sobre cómo manejar eventos en un control ActiveX y enviar y recibir información, y eso está bien, pero parece demasiado complicado. No busco comunicarme con el control ActiveX, solo necesito una función de JavaScript para disparar cuando hago clic en ella, de forma similar a una etiqueta o

. Puedo manejar todo lo demás en JavaScript. Simplemente envolviendo el control en un o

con un evento onclick no tiene ningún efecto, el control ActiveX prácticamente lo anula.

¿Hay una forma simple de manejar esto para un control ActiveX escrito en C #?

Creo que otra forma de decirlo es: estoy trabajando con un control de terceros y tenemos que usar un código similar al siguiente para que se comunique con nuestra página HTML a través de JavaScript.

    

Donde AXObjectName es el nombre / id del control y AXObjectName_OnMouseClick es el nombre de la función de JavaScript que se activará en mi código, pasando un parámetro de index . Sin embargo, ¿qué tengo que hacer para configurar un método como OnMouseClick en el control? Y si no quiero pasar ninguna información real (es decir, sin index ) ¿tengo que llegar hasta aquí?

Los eventos ActiveX se manejan a través de COM, por lo que debe profundizar un poco en ellos.

Lo que hay que recordar con COM es que todo se maneja a través de interfaces, por lo que normalmente necesitas crear dos interfaces, una para cada propiedad y otra para tus eventos.

La clave para los eventos es marcar su clase con el atributo ComSourceInterfaces, que MSDN describe como “Identifica una lista de interfaces expuestas como fonts de eventos COM para la clase atribuida”.

Esta estructura de clase simple debería funcionar para usted (tiene para mí en el pasado).

 namespace MyActiveX { [Guid("Your-GUID") ,InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface IActiveXEvents { [DispId(1)] void OnMouseClick(int index); } [Guid("Another-GUID"),InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface IActiveX { //[DispId(1)] // Any properties you want here like this // string aProperty { get; set; } } [ComVisible(true)] [Guid("Yet-Another-GUID"), ClassInterface(ClassInterfaceType.None)] [ProgId("MyActiveX")] [ComSourceInterfaces(typeof(IActiveXEvents))] public partial class MyActiveX : UserControl, IActiveX { public delegate void OnMouseClickHandler(int index); public event OnMouseClickHandler OnMouseClick; // Dummy Method to use when firing the event private void MyActiveX_nMouseClick(int index) { } public MyActiveX() { InitializeComponent(); // Bind event this.OnMouseClick = new OnMouseClickHandler(this.MyActiveX_MouseClick) } public void FireTheEvent() { int index = -1; this.OnMouseClick(index); } } } 

Si no necesita ninguna propiedad, puede excluir la interfaz IActiveX. Además, si va a utilizar el evento Click, deberá marcarlo como nuevo para pasarlo a COM.