VC如何获取IE浏览器的滚动条位置

xali 2012-09-26 08:09:17
VC6.0的SDK已经更新过,已经知道网页的窗口句柄,用IHTMLTextContainer和IHTMLWindow2获得的滚动条位置信息scrollTop总是为0,有没有做过的给出可用的VC代码,要求能获得所有网页的滚动条scrollTop信息。
如能解决问题,分数可以再加。
...全文
400 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
yao_rc 2014-09-02
  • 打赏
  • 举报
回复
请问楼主你这个问题解决了吗?我也碰到了,求解决方法
xali 2012-10-02
  • 打赏
  • 举报
回复
HINSTANCE hInst = LoadLibrary( _T("OLEACC.DLL") );
IWebBrowser2* pWebBrowser2=NULL;
if ( hWnd != NULL ){//hWnd是网页的窗口句柄

LRESULT lRes;
UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
::SendMessageTimeout( hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );

LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, LPCSTR("ObjectFromLresult") );
if ( pfObjectFromLresult != NULL ){
HRESULT hr;
CComPtr<IHTMLDocument2>spDoc;

hr=pfObjectFromLresult(lRes,IID_IHTMLDocument2,0,(void**)&spDoc);
if ( SUCCEEDED(hr) ){
........//已经获得网页的IHTMLDocument2的指针
}
}
}
xali 2012-10-02
  • 打赏
  • 举报
回复
谢谢redui,这个我这两天没过来看,你的代码很精练,又学习到新知识了。
redui 2012-09-29
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

补充:
昨天,我试验了修改网页内容,document.documentElement.scrollTop的值总是对的,
而document.body.scrollTop总是为0,这也验证了前几天的试验。这几天试验的太多,
代码都是乱的,以前能得到的ScrollLeft都得不到了。
网页中JavaScript获取滚动条Top位置的代码是这样:
if (document.documen……
[/Quote]

顺便提个小建议,你的JS代码还要继续磨练,可以写得更简练,四行代码可以一句写完:
scrollY = (document.documentElement || document.body).scrollTop;
youcry 2012-09-29
  • 打赏
  • 举报
回复
楼主能多贴点代码吗
傻X 2012-09-27
  • 打赏
  • 举报
回复
收藏了
redui 2012-09-27
  • 打赏
  • 举报
回复
再这样试试,不通过body,而是通过documentElement来获取。、

IHTMLDocument2::QueryInterface --> IHTMLDocument3
IHTMLDocument3::get_documentElement --> IHTMLElement
IHTMLElement::QueryInterface --> IHTMLElement2
IHTMLElement2::get_scrollTop/scrollLeft

据说(只是据说),早期IE版本可以通过body.scrollTop获取,后期版本(可能是IE6)就失效了。

如果还有问题,再尝试一下取消HTML文档头的申明,因为DTD类型对浏览器的行为有影响,去掉类似下面这个语句:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
当然,DTD代表页面符合规范,去掉DTD可能导致无法预料的显示结果。
xali 2012-09-27
  • 打赏
  • 举报
回复
补充:
昨天,我试验了修改网页内容,document.documentElement.scrollTop的值总是对的,
而document.body.scrollTop总是为0,这也验证了前几天的试验。这几天试验的太多,
代码都是乱的,以前能得到的ScrollLeft都得不到了。
网页中JavaScript获取滚动条Top位置的代码是这样:
if (document.documentElement)
scrollY = document.documentElement.scrollTop;
else if (document.body)
scrollY = document.body.scrollTop;
所以觉得应该是在IHTMLElement2上多想办法,早知道有redui昨天就该休息了,哈哈。
xali 2012-09-27
  • 打赏
  • 举报
回复
非常感谢redui,这两天熬夜,起得晚,刚刚照你说的做了,一次成功!
现在才回帖,有点不好意思,见谅。
补充一下:
IHTMLDocument2::get_parentWindow --> IHTMLWindow2
IHTMLWindow2::scrollTo(0,Y);
就可以将网页滚动条移到Y的位置。
另外,我去掉网页开头DOCTYPE的时候,可以显示,但取不到scroll的Y值(=0)。
本来想试试自己想的其他方法呢,现在不需要了,再次感谢redui!
lgstudyvc 2012-09-26
  • 打赏
  • 举报
回复
能获取到ie的范围不?
CRect IERect;
CWnd* hParent = GetParent();
hParent->GetClientRect(&IERect);
redui 2012-09-26
  • 打赏
  • 举报
回复
只有进入DOM才能获取网页滚动条位置,通常获得body元素,查询出IHTMLElement2,然后取IHTMLElement2::scrollTop属性
xali 2012-09-26
  • 打赏
  • 举报
回复
如果能解决问题,分数可以再加。
xali 2012-09-26
  • 打赏
  • 举报
回复
好,谢谢!
我要是能解决,一定和大家分享,希望高手能指点迷津。
youcry 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

谢谢redui,你写的就是我这两天反复试过的,看来只有做过才能知道究竟如何。
如果你或者其他朋友能给出你能成功运行的代码也行,问题是我得到的get_scrollTop
一直都是0,这个问题是有些难。
谁有成功的代码或经验不妨在这里供大家学习一下。
[/Quote]

我也问过跟你同样的问题,就在1个月前,我擦,得到的答案还没你的多,这个问题确实很难,找了很多资料都是
类似5楼那样,我一直都没有成功过。如果楼主成功了,也请一定要和我分享,我的这个问题还在,先谢谢楼主了!!!
这是我的qq:1466818926 真诚的希望楼主能解决问题!
xali 2012-09-26
  • 打赏
  • 举报
回复
谢谢redui,你写的就是我这两天反复试过的,看来只有做过才能知道究竟如何。
如果你或者其他朋友能给出你能成功运行的代码也行,问题是我得到的get_scrollTop
一直都是0,这个问题是有些难。
谁有成功的代码或经验不妨在这里供大家学习一下。
redui 2012-09-26
  • 打赏
  • 举报
回复
IHTMLDocument2::get_body --> IHTMLElement
IHTMLElement::QueryInterface --> IHTMLElement2
IHTMLElement2::get_scrollTop
xali 2012-09-26
  • 打赏
  • 举报
回复
获得了网页的IHTMLDocument2指针是否就等于进入DOM?通过IHTMLDocument2的get_body得到IHTMLWindow,再查询到IHTMLTextContainer或IHTMLWindow2?我试过几个代码,得到的scrollTop总是为0。有人说,网页是标准网页scrollTop总是为0,有没有解决的办法?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧