Joã*_*sto 12 c++ bho onscroll internet-explorer-9
我最近注意到,如果我在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()
Run Code Online (Sandbox Code Playgroud)
而我正在这样下沉.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
其中_spDocument是a CComPtr<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);
};
Run Code Online (Sandbox Code Playgroud)
因为,现在根据msdn文件中的OnScrollEvent,如果浏览器是版本9并且页面包含IE = 9,那么我需要下沉的事件...但SDK不包含该信息...
任何帮助表示赞赏.谢谢.