如何点击时用JavaScript编写用ActiveX编写的ActiveX控件?

我已经在SO上看到了一些与此相关的问题,但我认为我的情况有所不同,不能被视为重复(如果我错了,请告诉我)。

我有一个用C#编写的ActiveX控件,虽然我主要使用它,但我想在点击时用JavaScript引发一个事件(它显示一个图像,因此它是页面上的一个可视元素)。

我想要完成的最终目标与标签没有什么不同,并且当点击标签区域时它有一个onclick事件来引发JavaScript函数。

我读过的大部分内容都详细介绍了如何处理ActiveX控件中的事件并来回发送信息,这很好,但看起来过于复杂。 我不打算与ActiveX控件进行通信,我只需要一个JavaScript函数,当我点击它时,它会以类似于

标签的方式启动。 我可以用JavaScript处理其他所有内容。 简单地使用onclick事件将控件包装在

无效 – ActiveX控件几乎覆盖了它。

是否有一种简单的方法来处理用C#编写的ActiveX控件?

我想另一种方式是 – 我正在使用第三方控件,我们必须使用类似于以下的代码来通过JavaScript与我们的HTML页面进行通信

    

其中AXObjectName是控件的名称/ id,而AXObjectName_OnMouseClick是JavaScript函数的名称,它将在我的代码中触发,传递一个index参数。 但是,在控件中设置像OnMouseClick这样的方法我需要做些什么呢? 如果我不想传递任何实际信息(即没有index ),我甚至不得不走这么远吗?

ActiveX事件是通过COM处理的,所以你不得不深入研究它。

COM需要记住的是,所有内容都是通过接口处理的,因此您通常需要创建两个接口,一个用于任何属性,一个用于您的事件。

事件的关键是使用ComSourceInterfaces属性标记您的类,该属性由MSDN描述为“标识作为属性类的COM事件源公开的接口列表”。

这个简单的类结构应该适合你(过去对我有用)。

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

如果您不需要任何属性,则可以排除IActiveX接口。 此外,如果您要使用Click事件,则需要将其标记为事件以将其传递给COM。