如何在JavaScript中点击时使用C#编写的ActiveX控件触发事件?

7

我在SO上看到一些与此相关的问题,但我认为我的问题足够不同,不应被视为重复(如果我错了,请告诉我)。

我编写了一个用C#编写的ActiveX控件,虽然它大部分工作已经完成,但我希望在单击时在JavaScript中触发一个事件(它显示一个图像,因此是页面上的可视元素)。

我想要实现的最终目标与其作为<span>标记并且具有onclick事件来提高单击标记区域时引发JavaScript函数没有什么不同。

大部分我读到的都非常详细地介绍如何处理ActiveX控件中的事件并发送信息,这很好,但似乎过于复杂。我不需要与ActiveX控件通信,我只需要点击时触发JavaScript函数,类似于<div>标记或<span>标记。 我可以在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),我是否需要这么做?


我猜你已经看过这段代码示例:http://www.c-sharpcorner.com/UploadFile/dsandor/ActiveXInNet11102005040748AM/ActiveXInNet.aspx - MusiGenesis
我只是包含了这个链接,以便我可以在我的另一台电脑上找到它。我将尝试自己进行ActiveX控件实验,也许可以弄清楚事件的事情。看起来相对简单。 - MusiGenesis
@MusiGenesis:是的,这是我迄今为止遵循的其中之一。然而,它没有展示与ActiveX控件交互如何对页面中的JavaScript产生任何影响。 - Tom Kidd
1个回答

12

由于ActiveX事件是通过COM处理的,所以您需要深入了解一下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 事件,您需要将其标记为 new 才能传递给 COM。

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


哈哈 :) 这篇博客文章真的很好,关于ActiveX和C#的信息确实很难找到。我仍然发现了如何做到这一点:http://stackoverflow.com/questions/746822/accessing-activex-ambient-properties-from-c - ParmesanCodice
@MusiGenesis 我开始相信这是微软邪恶计划的一部分,旨在淘汰ActiveX。这对我们仍需要使用此技术的人并没有帮助。在VB .NET中,情况会稍微容易一些,请参见http://www.codeproject.com/KB/COM/VS2005ComDllWalkThru.aspx。 - ParmesanCodice
1
对于那些寻找Schnapple链接的人,链接已更新为http://blog.ianchivers.com/2011/01/internet-explorer-activex-control-c.html。 - Mike Schall
这比你想象的更容易。请参见https://dev59.com/W2XWa4cB1Zd3GeqPL1am - Cheeso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接