【问题标题】:.NET ActiveX Component in IE - How to Get Browser ReferenceIE 中的 .NET ActiveX 组件 - 如何获取浏览器参考
【发布时间】:2008-09-16 13:14:47
【问题描述】:

我承认我对 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 中获取对客户端站点(浏览器窗口)的引用?我通过实现 IObjectWithSite 在 BHO 中完成了这项工作,但我认为这不是 ActiveX 控件的正确方法。如果我在尝试用 Javascript 实例化时在 CTIActiveX 上实现任何接口(我的意思是像 IObjectWithSite 这样的 COM 接口),我会收到一个错误,即该对象不支持自动化。

【问题讨论】:

    标签: c# .net internet-explorer activex


    【解决方案1】:

    首先,您的界面需要 ComVisible(true) 才能被调用脚本看到(这可能是导致错误的原因)。

    其次,将项目中的 .NET 引用添加到“Microsoft.mshtml”。这将为各种与 IE 相关的事物(窗口、HTML 文档等)导入 COM 接口

    然后,您需要将 IHtmlDocument2 类型的属性添加到您的界面:

    IHtmlDocument2 Document { set; }
    

    ...在你的类中实现它:

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

    ...从脚本调用它

    CTIAX.Document = document; 
    

    ...一旦您存储了对文档的引用,您就可以随意使用它来访问窗口、其他框架或您希望的 HTML DOM 的任何部分。

    【讨论】:

    • 很好的答案可以帮助我解决另一个问题;但是,这并不是我要寻找的东西。 IHTMLDocument2.parentWindow 返回一个 mshtml.IHTMLWindow2,而不是 SHDocVw.WebBrowser。我正在寻找 SHDocVw.WebBrowser,以便我可以使用 GetProperty 和 PutProperty 方法与 BHO 进行通信。
    • 另外,需要明确的是,问题中的示例确实有效。如果实现类指定 ComVisible(如我的示例中所示),则似乎不需要 ComVisible(true)。只有当我显式实现 COM 接口(如 IObjectWithSite)时,它才会中断。
    【解决方案2】:

    我找到了一个可行的解决方案。这并不理想,因为它依赖于匹配 IE 窗口的位置 URL 来获取正确的容器,但它确实有效。在我的情况下,我在查询字符串上使用了一个特殊值来确保我得到正确的窗口。

    这获得了对 SHDocVw.InternetExplorer 的引用,它公开了与 SHDocVw.WebBrowser 相同的 GetProperty 和 PutProperty:

    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;
    }
    

    【讨论】:

    • 您最初是如何获得该网址的?
    【解决方案3】:

    有一种简单而干净的方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-08
      • 2010-10-23
      • 2012-11-05
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多