【问题标题】:How do I add an event listener using MSHTML's addEventListener in IE9?如何在 IE9 中使用 MSHTML 的 addEventListener 添加事件监听器?
【发布时间】:2011-02-15 01:58:05
【问题描述】:

addEventListener 的 MSDN 文档说它接受 IDispatch * 对象形式的回调函数。在 C#(我使用的是 COM 互操作)中,Visual Studio 将参数类型显示为 object

我寻找IEventListener 接口或类似的东西,但没有找到。我应该传递什么?

【问题讨论】:

    标签: c# mshtml internet-explorer-9 addeventlistener iwebbrowser2


    【解决方案1】:

    经过一番研究,我了解到这些 COM 连接点(事件处理程序)是用DispId(0) 指定的。回调函数由以下类的实例表示:

    // These attributes may be optional, depending on the project configuration.
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.AutoDispatch)]
    public class EventListener
    {
        [DispId(0)]
        // The "target" parameter is an implementation detail.
        public void NameDoesNotMatter(object target, IDOMEvent evt) { ... }
    }
    

    由于DispId(0) 指定了要调用的默认方法,因此方法的实际名称并不重要。但是,方法参数确实很重要。例如,IHTMLElement.onclick 必须分配一个不带参数的回调,而 IHTMLElement2.attachEvent 接受一个带有 IHTMLEventObj 类型参数的回调(或 IHTMLEventObj2,...,6,甚至只是 object )。

    总之,COM IDispatch 回调可以在 C# 中使用 COM 可见类实现,该类具有接受正确参数并带有 [DispId(0)] 注释的方法。


    尽管如此,避免 W3C DOM 事件 API 的解决方案可能更合适,因为 IE9 DOM 对象在浏览器使用较低文档模式以实现兼容性时不支持此方法。例如,使用addEventListener 的扩展程序将在像 Bing 这样的页面上失败,该页面以 IE7 模式呈现。

    除了通过 F12 开发人员工具手动设置之外,似乎也无法设置 IWebBrowser2 实例使用的文档模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 2022-10-25
      • 2020-06-13
      相关资源
      最近更新 更多