最近、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 は でCComPtr<IHTMLDocument2>
、_spWindow はCComPtr<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 にはその情報が含まれていません。 ...
どんな助けでも大歓迎です。ありがとう。