IE11 的 IOleClientSite 实现丢失 WM_KEYUP ans WM_KEYDOWN 事件
IOleClientSite implementation for IE11 loses WM_KEYUP ans WM_KEYDOWN events
我在 C++ 应用程序中嵌入了 Internet Explorer 11。我实现了以下接口:
IDocHostUIHandler
这会将所有方法传递给原始实现,但 GetExternal 除外,returns 我对外部对象的实现。
IOleClientSite
这将所有方法传递给原始实现。请求时,QueryInterface 实现 returns 我的 IDocHostUIHandler。它也 returns 本身为 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 实现中的问题。
原来这是两个问题的结合。包含浏览器的 QAxWidget 需要在派生 class 中实现 TranslateKeyEvent。此外,您不能提供 IOleClientSite 的实现,因为 Qt3.3 已损坏,并且在内部它将继续引用它自己的实现而不是新的实现。我不得不修改 QAxWidget 以添加一个 setDocHostUIHandler 函数并将其 QueryInterface 修改为 return 这个。因此,默认的 IOleClientSite 将 return 成为 IID_IDocHostUIHandler.
的正确接口
我在 C++ 应用程序中嵌入了 Internet Explorer 11。我实现了以下接口:
IDocHostUIHandler
这会将所有方法传递给原始实现,但 GetExternal 除外,returns 我对外部对象的实现。
IOleClientSite
这将所有方法传递给原始实现。请求时,QueryInterface 实现 returns 我的 IDocHostUIHandler。它也 returns 本身为 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 实现中的问题。
原来这是两个问题的结合。包含浏览器的 QAxWidget 需要在派生 class 中实现 TranslateKeyEvent。此外,您不能提供 IOleClientSite 的实现,因为 Qt3.3 已损坏,并且在内部它将继续引用它自己的实现而不是新的实现。我不得不修改 QAxWidget 以添加一个 setDocHostUIHandler 函数并将其 QueryInterface 修改为 return 这个。因此,默认的 IOleClientSite 将 return 成为 IID_IDocHostUIHandler.
的正确接口