12

我最近注意到,如果我在 IE9 中显示页面并且页面包含标签,则无法捕获 BHO 中“顶部”窗口的 OnSroll 事件:<meta http-equiv="X-UA-Compatible" content="IE=9">.

我通过在顶部文档的 IHTMLWindow2 中下沉 DIID_HTMLWindowEvents2 的 DISPID_HTMLWINDOWEVENTS2_ONSCROLL 来捕获滚动,并且它在所有情况下都可以正常工作,除非页面包含该元标记。

我的接收器类定义为:

class CIEPage : public IDispEventImpl<1, CIEPage, &DIID_HTMLDocumentEvents2, &LIBID_MSHTML, 4, 0>,
    public IDispEventImpl<2, CIEPage, &DIID_HTMLWindowEvents2, &LIBID_MSHTML, 4, 0>


// SinkMap
    BEGIN_SINK_MAP(CIEPage)           
        SINK_ENTRY_EX(1, DIID_HTMLDocumentEvents2, DISPID_HTMLELEMENTEVENTS2_ONMOUSEOVER, OnMouseOver)                       
        SINK_ENTRY_EX(2, DIID_HTMLWindowEvents2, DISPID_HTMLWINDOWEVENTS2_ONSCROLL, OnScroll)               
    END_SINK_MAP()

我正在像这样下沉。

hr = IDispEventImpl<1, CIEPage, &DIID_HTMLDocumentEvents2, &LIBID_MSHTML, 4, 0>::DispEventAdvise(_spDocument);
if(SUCCEEDED(hr))           
    _bAdvised[ListenerEventMouseOver] = true;

if(IsTopPage())
{

hr = _spDocument->get_parentWindow(reinterpret_cast<IHTMLWindow2 **>(&_spWindow));
if (SUCCEEDED(hr) && _spWindow)
{
     hr = IDispEventImpl<2, CIEPage, &DIID_HTMLWindowEvents2, &LIBID_MSHTML, 4, 0>::DispEventAdvise(_spWindow);                       
     if(SUCCEEDED(hr))   
          _bAdvised[ListenerEventScroll] = true;                                                           
  }

}

其中 _spDocument 是 aCComPtr<IHTMLDocument2>和 _spWindow aCComPtr<IHTMLWindow2>

有什么想法吗?此外,IE9 SDK 标头和 msdn 的文档似乎也存在不匹配。例如,文档中 IE 9 的新文档事件定义了许多 SDK 中不可用的事件。这是 mshtml.idl 中的定义

[
    hidden,
    uuid(30510737-98b5-11cf-bb82-00aa00bdce0b)
]
dispinterface HTMLDocumentEvents4
{
properties:
methods:
    [id(DISPID_HTMLDOCUMENTEVENTS4_ONMSTHUMBNAILCLICK)] void onmsthumbnailclick([in] IHTMLEventObj* pEvtObj);
    [id(DISPID_HTMLDOCUMENTEVENTS4_ONMSSITEMODEJUMPLISTITEMREMOVED)] void onmssitemodejumplistitemremoved([in] IHTMLEventObj* pEvtObj);
};

因为,现在根据 msdn 在文档上有一个 OnScrollEvent,如果浏览器版本为 9 并且页面包含 IE=9,那么我可能需要接收该事件......但 SDK 不包含该信息...

任何帮助表示赞赏。谢谢。

4

0 回答 0