Как я могу создать элемент управления ActiveX, написанный с помощью C #, вызывать события в JavaScript при нажатии?

Я уже вижу несколько связанных с этим вопросов на SO, но я думаю, что мой вопрос достаточно отличается, чтобы не считаться дубликатом (если я ошибаюсь, дайте мне знать).

У меня есть элемент управления ActiveX, который я написал на C #, и хотя он у меня в основном работает, я хочу вызывать событие в JavaScript при его нажатии (он отображает изображение, поэтому это визуальный элемент на странице).

Конечная цель того, чего я хочу достичь, ничем не отличается от того, если бы это был тег <span> и у него было бы событие onclick для вызова функции JavaScript при нажатии на область тега.

Большая часть материала, которую я читал в нем очень подробно рассказывается, как обрабатывать события в элементе управления ActiveX и отправлять информацию туда и обратно, и это нормально, но кажется слишком сложным. Я не хочу связываться с элементом управления ActiveX, мне просто нужно, чтобы функция JavaScript запускалась, когда я щелкаю по ней, аналогично тегу <span> или <div>. Я могу справиться со всем остальным на JavaScript. Простое включение элемента управления в <span> или <div> с событием onclick не имеет никакого эффекта - элемент управления ActiveX в значительной степени отменяет его.

Есть ли простой способ справиться с этим для элемента управления ActiveX, написанного на C #?

Я предполагаю, что другой способ выразить это - я работаю со сторонним элементом управления, и мы должны использовать код, похожий на следующий, чтобы заставить его взаимодействовать с нашей HTML-страницей через JavaScript.

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

Где AXObjectName - имя / идентификатор элемента управления, а AXObjectName_OnMouseClick - имя функции JavaScript, которая будет запускаться в моем коде, передавая параметр index. Однако что мне нужно сделать, чтобы настроить такой метод, как OnMouseClick, в элементе управления? И если я не хочу передавать какую-либо актуальную информацию (т.е. не index), нужно ли мне заходить так далеко?


person Tom Kidd    schedule 21.09.2009    source источник
comment
Полагаю, вы уже видели этот пример кода: c-sharpcorner .com / UploadFile / dsandor /   -  person MusiGenesis    schedule 21.09.2009
comment
На самом деле я просто включил ссылку, чтобы найти ее на другом компьютере. Я сам собираюсь попробовать поэкспериментировать с ActiveX и, возможно, выяснить причину события. Выглядит относительно просто.   -  person MusiGenesis    schedule 21.09.2009
comment
@MusiGenesis: да, и это один из тех, за кем я следил, чтобы зайти так далеко. Однако он не показывает, как взаимодействие с элементом управления ActiveX может повлиять на JavaScript на странице.   -  person Tom Kidd    schedule 21.09.2009


Ответы (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.

person ParmesanCodice    schedule 21.09.2009
comment
Ха-ха :) Это действительно хороший пост в блоге по этому поводу, очень сложно найти хорошую информацию об ActiveX и C #. Я все еще узнал, как это сделать: stackoverflow.com/questions/746822/ - person ParmesanCodice; 22.09.2009
comment
@MusiGenesis Я пришел к выводу, что это часть зловещего плана Microsoft по уничтожению ActiveX. Не помогает нам, ребята, которым еще нужно производить эту технологию. В VB .NET все на немного проще, см. codeproject.com /KB/COM/VS2005ComDllWalkThru.aspx - person ParmesanCodice; 23.09.2009
comment
Для тех, кто ищет ссылку на Schnapple, ссылка была обновлена ​​до blog.ianchivers.com/2011/01/ - person Mike Schall; 07.06.2012
comment
Это проще, чем это. См. stackoverflow.com/questions/11175145/ - person Cheeso; 24.06.2012