我想获取IE窗口滚动条的当前位置,我已经根据窗口句柄获取到了IHTMLDocument2的对象指针。并且根据IHTMLDocument2的指针获取到了BODY对象,HRESULT IHTMLDocument2::get_body(IHTMLElement **p);是这样做吗?然后接下来要怎么做?
在线等。快帮忙解决下吧,谢谢了!

解决方案 »

  1.   

    自己回复下
    BOOL CALLBACK CBookToolDlg::EnumChildProc( HWND hwnd,LPARAM lParam )
    {
    char szClassName[512] = {0};
    GetClassName(hwnd,szClassName,512);
    OutputDebugString(szClassName);
    IEINFO io;
    CoInitialize( NULL );
    if (strcmp(szClassName,"Internet Explorer_Server") == 0)
    {
    io.IEHwnd=hwnd;

    CComPtr<IHTMLDocument2> spDoc;
    LRESULT lRes;

    IHTMLElement*   pElembody;
    long pos;

    UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
    ::SendMessageTimeout( hwnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );
    HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );
    LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
    if ( pfObjectFromLresult != NULL )
    {
    HRESULT hr;
    hr = (*pfObjectFromLresult)( lRes, IID_IHTMLDocument, 0, (void**)&spDoc );
    if ( SUCCEEDED(hr) )
    {
    spDoc->get_body(&pElembody);
    ((IHTMLTextContainer*)pElembody)->get_scrollTop(&pos);
    io.pos=pos;
    m_IEInfo.push_back(io);
    }
    }
    ::FreeLibrary( hInst );
    memset(szClassName,'\0',sizeof(szClassName));

    }    
    CoUninitialize();
    return TRUE;
    }
    在这段代码中运行到spDoc->get_body(&pElembody);时,报内存错误,这是怎么回事啊?
    哪位高手帮帮忙啊
      

  2.   

    body对象有scrollLeft,scrollTop等几个属性。在msdn,www.codeproject.com里查查,有例子的
      

  3.   

    加一个判断 
    if( spDoc )
    spDoc值可能为NULL
      

  4.   

    不是spDoc 的问题,这个内存报错的问题解决了,就是还是原先的问题:
    我想获取IE窗口滚动条的当前位置,我已经根据窗口句柄获取到了IHTMLDocument2的对象指针。并且根据IHTMLDocument2的指针获取到了BODY对象,HRESULT IHTMLDocument2::get_body(IHTMLElement **p);是这样做吗?然后接下来要怎么做? 
      

  5.   

    http://topic.csdn.net/t/20050117/11/3731294.htmlIHTMLDocument2   *pDocument=(IHTMLDocument2*)m_browser.get_Document   ();   
        IHTMLWindow2   *pWindow;   
        pDocument->get_parentWindow   (&pWindow);   
      使用IHTMLWindow来取
      

  6.   

    IHTMLDocument2  *pDocument=(IHTMLDocument2*)m_browser.get_Document  ();  
        IHTMLWindow2  *pWindow;  
        pDocument->get_parentWindow  (&pWindow);  
      使用IHTMLWindow来取
    这个里面m_browser是什么啊?能否说的明白点?
      

  7.   

    IHTMLElement2* body2=NULL;
    body->QueryInterface(IID_IHTMLElement2, &body2);
    long left;
    body2->get_scrollLeft(&left);
      

  8.   

    ScrollBarPos scrollPos;
    scrollPos.top=0;
    scrollPos.left=0;
    try
    {
    //ASSERT(m_pBrowserApp != NULL);
    if(m_pBrowserApp!=NULL)
    {
    IDispatch *pDisp=NULL;
    pDisp = GetHtmlDocument();
    //ASSERT(pDisp);
    if(pDisp!=NULL)
    {
    HRESULT hr;
    IHTMLDocument2 *pDocument = NULL;
    hr = pDisp->QueryInterface( IID_IHTMLDocument2, (void**)&pDocument );
    //ASSERT(SUCCEEDED(hr));
    //ASSERT(pDocument);
    if(SUCCEEDED(hr) && pDocument!=NULL)
    {
    IHTMLElement *pBody = NULL;
    hr = pDocument->get_body(&pBody);
    //ASSERT(SUCCEEDED(hr));
    //ASSERT(pBody);
    if(SUCCEEDED(hr) && pBody!=NULL)
    {
    IHTMLElement2 *pElement = NULL;
    hr = pBody->QueryInterface(IID_IHTMLElement2,(void**)&pElement);
    //ASSERT(SUCCEEDED(hr));
    //ASSERT(pElement);
    if(SUCCEEDED(hr) && pElement!=NULL)
    {
    pElement->get_scrollTop(&scrollPos.top);
    pElement->get_scrollLeft(&scrollPos.left);
    }
    }
    }
    pDisp->Release();
    }
    }
    }catch(...)
    {}
    return scrollPos;
      

  9.   

    有没有人再进来帮忙看下啊,我现在是在部分网页中可以获得到滚动条的位置了,使用的方法是先获得IHTMLDocument2指针spDoc,然后根据IHTMLElement*   pElembody;spDoc->get_body(&pElembody);来获取pElembody,然后就pElembody->QueryInterface(IID_IHTMLTextContainer, (LPVOID *)(&pCont));   
    if (!pCont)
    {
    return;
    }
    pCont->get_scrollTop(&pos);
    这样是可以获取到pos了,但是某些网站,这样是不行。
    [color=#FF0000]解决办法是只需把document.body用document.documentElement替换即可。 这句话是什么意思啊?在VC中要怎么实现这句话?[/color]
    哪位大哥来帮忙看下啊,不胜感激!!!!