我怎样才能让在JavaScript中C#引发事件写了一个ActiveX控件,点击时?(How can

2019-07-18 19:13发布

我看到与此相关的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>

AXObjectName是控件的名称/ ID和AXObjectName_OnMouseClick是JavaScript函数会在我的代码火的名字,传递一个index参数。 然而,什么都做我必须做的设立等的方法OnMouseClick在控制? 如果我不想传递任何实际信息(即无index )我连这样走多远?

Answer 1:

的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。



文章来源: How can I make an ActiveX control written with C# raise events in JavaScript when clicked?