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

Tom*_*idd 7 c# activex onclick

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

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

我想要完成的最终目标与它是一个<span>标签没什么不同,并且onclick当点击标签的区域时它有一个事件来提升JavaScript函数.

我读过的大部分内容都详细介绍了如何处理ActiveX控件中的事件并来回发送信息,这很好,但看起来过于复杂.我不打算与ActiveX控件进行通信,我只需要一个JavaScript函数,当我点击它时,以类似于<span><div>标记的方式触发.我可以用JavaScript处理其他所有内容.简单地将控件包装在一个<span><div>一个onclick事件中没有任何效果 - ActiveX控件几乎覆盖了它.

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

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

<script type="text/javascript" event="OnMouseClick(index)" for="AXObjectName"> 
        <!--
         AXObjectName_OnMouseClick(index);
        //-->
</script>
Run Code Online (Sandbox Code Playgroud)

AXObjectName控件的名称/ ID 在哪里,AXObjectName_OnMouseClick它是我在代码中触发的JavaScript函数的名称,传递index参数.但是,我需要做些什么来设置OnMouseClick控件中的方法?如果我不想传递任何实际信息(即不index),我甚至不得不走这么远吗?

Par*_*ice 12

的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);
        }       
    }
}
Run Code Online (Sandbox Code Playgroud)

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