【问题标题】:IOleClientSite implementation for IE11 loses WM_KEYUP ans WM_KEYDOWN eventsIE11 的 IOleClientSite 实现丢失 WM_KEYUP 和 WM_KEYDOWN 事件
【发布时间】: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


【解决方案1】:

结果证明这是两个问题的结合。包含浏览器的 QAxWidget 需要在派生类中实现 TranslateKeyEvent。此外,您无法提供 IOleClientSite 的实现,因为 Qt3.3 已损坏,并且在内部它将继续引用它自己的实现而不是新的实现。我不得不修改 QAxWidget 以添加一个 setDocHostUIHandler 函数并修改它的 QueryInterface 以返回它。因此,默认的 IOleClientSite 将为 IID_IDocHostUIHandler 返回正确的接口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多