【发布时间】:2017-06-15 13:57:55
【问题描述】:
我在 C++ 应用程序中嵌入了 Internet Explorer 11。我已经实现了以下接口:
IDocHostUIHandler
这会将所有方法传递给原始实现,但 GetExternal 会返回我对外部对象的实现。
IOleClientSite
这会将所有方法传递给原始实现。 QueryInterface 实现在请求时返回我的 IDocHostUIHandler。它还为 IUnknown 返回自身。 我已经尝试将其他接口的请求传递给原始的 IOleClientSite 实现,但这对下面描述的问题没有影响。
我还在当前文档中附加了一个事件接收器,用于处理和触发 DOM 事件,但我确信这不是问题的一部分。
问题在于浏览器忽略了 WM_KEYDOWN 和 WM_KEYCHAR 消息(这些消息从不作为 DOM 事件触发),但确实响应了 WM_CHAR 消息(作为 DOM 按键事件触发)。 如果我不插入我的 IOleClientSite 实现,那么这些事件将得到正确处理。因此,我相当肯定在我的 IOleClientSite 实现中存在一些遗漏。 我的理解是,我必须实现 IOleClientSite 才能提供实现 IDocHostUIHandler(即,没有其他方法可以注入该接口的实现。) 为什么我的 WM_KEYDOWN 和 WM_KEYCHAR 消息被忽略?
请注意,其他一切工作正常。我可以从 JavaScript 调用我的外部对象上的方法,我可以在我的事件接收器中接收 DOM 事件,我可以将事件触发到 DOM。
不管怎样,底层站点是由 QT 3.3 QAxWidget 提供的。我知道这已经过时了。这项工作的最终目的是消除对旧代码的依赖。然而,当我的 IOleClientSite 被删除时,浏览器会正常运行,因此没有理由怀疑 QAxWidget 实现中存在问题。
【问题讨论】:
标签: internet-explorer com dom-events