IE11的IOleClientSite实现丢失WM_KEYUP和WM_KEYDOWN事件

时间:2017-01-30 12:00:57

标签: internet-explorer com dom-events

我在C ++应用程序中嵌入了Internet Explorer 11。我已经实现了以下接口:

的IDocHostUIHandler

除了GetExternal之外,它将所有方法传递给原始实现,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实现中存在问题。

1 个答案:

答案 0 :(得分:0)

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