.NET ActiveX Компонент в IE - Как получить ссылку на браузер - PullRequest
6 голосов
/ 16 сентября 2008

Я признаю, что знаю достаточно об архитектуре COM и IE только для того, чтобы быть опасным. У меня есть рабочий элемент управления C # .NET ActiveX, похожий на этот:

using System;
using System.Runtime.InteropServices;
using BrowseUI;
using mshtml;
using SHDocVw;
using Microsoft.Win32;

    namespace CTI
    {
        public interface CTIActiveXInterface
        {
            [DispId(1)]
            string GetMsg();
        }

        [ComVisible(true), ClassInterface(ClassInterfaceType.AutoDual)]
        public class CTIActiveX : CTIActiveXInterface
        {

            /*** Where can I get a reference to SHDocVw.WebBrowser? *****/
            SHDocVw.WebBrowser browser;

            public string GetMsg()
            {
                return "foo";
            }
        }
    }

Я зарегистрировался и создал библиотеку типов, используя regasm:

regasm CTIActiveX.dll /tlb:CTIActiveXNet.dll /codebase

И может успешно реализовать это в javascript:

var CTIAX = new ActiveXObject("CTI.CTIActiveX");
alert(CTIAX.GetMsg());  

Как получить ссылку на сайт клиента (окно браузера) в CTIActiveX? Я сделал это в BHO, реализовав IObjectWithSite, но я не думаю, что это правильный подход для элемента управления ActiveX. Если я реализую какой-либо интерфейс (я имею в виду интерфейс COM, такой как IObjectWithSite) в CTIActiveX, когда я пытаюсь создать экземпляр в Javascript, я получаю ошибку, что объект не поддерживает автоматизацию.

Ответы [ 3 ]

3 голосов
/ 16 сентября 2008

Во-первых, вашему интерфейсу необходим ComVisible (true), чтобы его мог увидеть вызывающий скрипт (это, вероятно, вызывает ошибку).

Во-вторых, добавьте .NETreference в вашем проекте к «Microsoft.mshtml». Это импортирует COM-интерфейсы для различных вещей, связанных с IE (Windows, HTML-документы и т. Д.)

Затем вам нужно добавить свойство типа IHtmlDocument2 в ваш интерфейс:

IHtmlDocument2 Document { set; }

... реализуйте это в своем классе:

public IHtmlDocument2 Document
{
  set { _doc = value;}
}

... вызвать его из сценария

CTIAX.Document = document; 

... как только вы сохранили ссылку на документ, вы можете использовать ее по своему желанию, чтобы перейти к окну, другим фреймам или любой части HTML DOM, которую вы пожелаете.

1 голос
/ 16 сентября 2008

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

Получает ссылку на SHDocVw.InternetExplorer, который предоставляет те же GetProperty и PutProperty, что и SHDocVw.WebBrowser:

private InternetExplorer GetIEWindow(string url)
{
    SHDocVw.ShellWindowsClass sh = new ShellWindowsClass();
    InternetExplorer IE;

    for (int i = 1; i <= sh.Count; i++)
    {
        IE = (InternetExplorer)sh.Item(i);
        if (IE != null)
        {
            if (IE.LocationURL.Contains(url))
            {
                return IE;
            }
        }
    }

    return null;
}
0 голосов
/ 02 мая 2012

Есть простой и понятный способ сделать это:

public void GetBrowser()
        {

            ShellWindows m_IEFoundBrowsers = new ShellWindows();

            foreach (InternetExplorer Browser in m_IEFoundBrowsers)
            {
                webBrowser = (SHDocVw.WebBrowser) Browser;
                 // do what you want ...
            }

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...