取得IE浏览器页面的滚动条位置(奇怪的现象)
我通过遍历,给网页内的所有frame安装了事件接收器,然后在事件接收器中提供了onscroll方法,目的是截获滚动条的滚动事件,当程序执行后,滚动事件接收到了,即当滚动网页内的滚动条时,onscroll被调用,在onscroll函数中取得滚动条的位置,但是奇怪的是对于有些网页可以正确取得其滚动条的位置,比如:百度,google等,而有些网页取到的滚动条位置却始终是0,比如:网易(www.163.com),我不知道产生这种现象的原因到底是什么?这些网页的滚动条到底有什么不同?为什么对有些网页可以而对某些网页不可以?还望高人指点!
1. 安装连接点的代码如下:
void CIEEventSink::EnumAllDocument( IHTMLDocument2 * pIHTMLDocument2)
{
if( !pIHTMLDocument2 ) return;
EnumFrames( pIHTMLDocument2);
}
void CIEEventSink::EnumFrames( IHTMLDocument2 * pIHTMLDocument2)
{
if ( !pIHTMLDocument2 ) return;
HRESULT hr;
CComPtr <IHTMLWindow2> spWin2;
hr = pIHTMLDocument2->get_parentWindow(&spWin2);
if(spWin2)
{
//安装连接点.
//事件接口ID: DIID_HTMLWindowEvents2
CDHTMLEventSink *pDHTMLEventSink = new CDHTMLEventSink();
pDHTMLEventSink->SetHtmlWindow2(spWin2);
if(!pDHTMLEventSink->AdviseSink())
{
//如果安装连接点失败,则删除接收器指针。
delete pDHTMLEventSink;
}
else
{
//如果安装连接点成功,则保存接收器的指针。
m_aHtmlWin2EventSink.Add(pDHTMLEventSink);
}
}
CComPtr< IHTMLFramesCollection2 > spFramesCollection2;
pIHTMLDocument2->get_frames( &spFramesCollection2 );
if(!spFramesCollection2) return;
long nFrameCount=0;
hr = spFramesCollection2->get_length( &nFrameCount );
if ( FAILED ( hr ) || 0 == nFrameCount )
{
return;
}
for(long i=0; i<nFrameCount; i++)
{
CComVariant vDispWin2;
hr = spFramesCollection2->item( &CComVariant(i), &vDispWin2 );
if ( FAILED ( hr ) ) continue;
CComQIPtr< IHTMLWindow2 > spWin2 = vDispWin2.pdispVal;
if( !spWin2 ) continue;
CComPtr < IHTMLDocument2 > spDoc2;
spWin2->get_document( &spDoc2 );
EnumAllDocument( spDoc2);
}
}
2. 事件接收器中onscroll的函数的代码如下:
void CDHTMLEventSink::OnScroll(IHTMLEventObj *pEvtObj)
{
if(!gpIESyncFrame->m_pStScrollPos)
{
gpIESyncFrame->m_pStScrollPos = new StScrollPos;
memset(gpIESyncFrame->m_pStScrollPos, 0x0, sizeof StScrollPos);
}
gpIESyncFrame->m_dwOldTimeScrollPos = GetTickCount();
CComPtr < IHTMLDocument2 > spDoc;
HRESULT hr = m_pHtmlWindow2->get_document(&spDoc);
if(!spDoc) return;
CComPtr<IHTMLElement> spBody;
spDoc->get_body(&spBody);
if(!spBody) return;
//CComQIPtr<IHTMLTextContainer> spContainer = spBody;
//hr = pBody->QueryInterface(IID_IHTMLTextContainer,(void**)&spContainer);
//ASSERT(SUCCEEDED(hr));
//ASSERT( spContainer );
//CPoint ScrollPos;
//spContainer->get_scrollTop(&ScrollPos.y);
//spContainer->get_scrollLeft(&ScrollPos.x);
CComQIPtr<IHTMLElement2> spElement = spBody;
if(!spElement) return;
//取得垂直滚动条的位置
long nTopPos;
spElement->get_scrollTop(&nTopPos);
//取得水平滚动条的位置
long nLeftPos;
spElement->get_scrollLeft(&nLeftPos);
}