CComPtr< IShellWindows > spShellWin;
HRESULT hrr = spShellWin.CoCreateInstance( CLSID_ShellWindows );
if ( FAILED( hrr ) )    return false; long nCount=0;
spShellWin->get_Count(&nCount);   // 取得浏览器实例个数
                   HWND hWnd //ie句柄
IHTMLElement *pdoc;
                  CComPtr< IDispatch >  doc2;
IViewObject* ViewObject = (IViewObject *) NULL;
for(long i=0; i<nCount; i++)//找出电脑打开的IE,并获取相关信息
{
CComPtr< IDispatch > spDisp;
hr=spShellWin->Item(CComVariant( i ), &spDisp );
if ( FAILED( hrr ) )    continue; CComQIPtr< IWebBrowser2 > spBrowser = spDisp;
if ( !spBrowser )      continue; hr =  spBrowser->get_HWND((long*)&pWeb); //浏览器句柄为什么获取不到呢??    spDisp.Release();
hr = spBrowser->get_Document( &spDisp );
if ( FAILED ( hrr ) )   continue; CComQIPtr< IHTMLDocument2 > spDoc = spDisp;
if ( !spDoc )          continue; if(NULL == ViewObject)
continue; hr = spDoc->get_body(&pdoc);
if (NULL == pdoc)
         continue; hr = pdoc->QueryInterface(IID_IHTMLElement2,(void**)&pElement); 
                           if(NULL == pElement)
continue; }
是我用法错了吗? 还是怎么回事? 谢谢各位

解决方案 »

  1.   

    hr = spBrowser->get_HWND((long*)&pWeb); //浏览器句柄为什么获取不到呢??   
    pWeb应该是一个HWND类型,看你的命名好像不对。是不是
    hr = spBrowser->get_HWND((long*)&hWnd);
      

  2.   

     那是我自己写错了,HWND hWnd 刚才定义临时的,没有改过来。跟这没有关系,我代码变量没有问题
      

  3.   

      IE6.0呢,不知道为什么获取不到,我也获取腾讯TT,也不行
      

  4.   

    刚好写过一段代码,不过没有用智能指针,你参考下。
    HRESULT hr;
    IShellWindows* psw = NULL;
    hr = ::CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_INPROC_SERVER, IID_IShellWindows, (void**)&psw);
    if (SUCCEEDED(hr))
    {
    long cnt;
    psw->get_Count(&cnt);
    long i;
    for (i = 0; i < cnt; i++)
    {
    IDispatch* pDisp = NULL;
    _variant_t var(i, VT_I4);
    hr = psw->Item(var, &pDisp);
    if (SUCCEEDED(hr))
    {
    IWebBrowser2* pwb = NULL;
    hr = pDisp->QueryInterface(IID_IWebBrowser2, (void**)&pwb);
    if (SUCCEEDED(hr))
    {
    char title2[512];
    HWND hwnd;
    pwb->get_HWND((long*)&hwnd);
    ::GetWindowText(hwnd, title2, 512);
    printf("%s\n", title2);
    pwb->Release();
    }
    pDisp->Release();
    }
    }
    psw->Release();
    }
      

  5.   

    //将webBrowser控件的内容保存为图片(包括整个页面跟指定区域)
    bool GenerateWebImage(CExplorer1* ppWeb, LPCTSTR lpszFileName,int x,int y,int width,int height)
    {//该原来代码,之前是把webBrowser控件保存图片,现在改为了,查找电脑打开的浏览器进行遍历保存
         bool bRet=false;
    RECT rcOld = {0,0,0,0};;
    HRESULT hr = NULL;
    pWeb->GetWindowRect(&rcOld); // 保存原来位置
    CWnd* pMainWnd = pWeb->GetParent();// 得到父窗口
    if(pMainWnd==NULL)
    rutrue flash;
    // 转换坐标
    pMainWnd->ScreenToClient(&rcOld); CComPtr< IShellWindows > spShellWin;
    HRESULT hrr = spShellWin.CoCreateInstance( CLSID_ShellWindows );
    if ( FAILED( hrr ) )    return false; long nCount=0;
    spShellWin->get_Count(&nCount);   // 取得浏览器实例个数 IHTMLElement *pdoc;
    HWND *hWnd);
    IHTMLElement2 *pElement = NULL;
    IViewObject* ViewObject = (IViewObject *) NULL;

    int j = 0;
    for(long i=j; i<nCount; i++)
    {

    BEGINLOOP:
    CComPtr< IDispatch > spDisp;
    hr=spShellWin->Item(CComVariant( i ), &spDisp );
    if ( FAILED( hrr ) )    continue; CComQIPtr< IWebBrowser2 > spBrowser = spDisp;
    if ( !spBrowser )      continue; LPOLESTR lpURL = NULL;
    spBrowser->get_LocationURL(&lpURL);// 获取浏览器地址
    hr =  spBrowser->get_HWND((long*)&hWnd);    
    spDisp.Release();
    hr = spBrowser->get_Document( &spDisp );
    if ( FAILED ( hrr ) )   continue; CComQIPtr< IHTMLDocument2 > spDoc = spDisp;
    if ( !spDoc )          continue; hr = spDoc->QueryInterface(IID_IViewObject,  (void**)&ViewObject);
           if(NULL == ViewObject)
    continue;
    hr = spDoc->get_body(&pdoc);
    if (NULL == pdoc)
    continue;
    hr = pdoc->QueryInterface(IID_IHTMLElement2,(void**)&pElement);  if(NULL == pElement)
    continue;
    j = i;//保存
    goto DRAWIMAGE;//跳出循环保存图片 }

    DRAWIMAGE:
    long  scrollTop,scrollLeft,scrollWidth,  scrollHeight;  // 得到文档实际大小
    pElement->get_scrollTop(&scrollTop);
    pElement->get_scrollLeft(&scrollLeft);
    pElement->get_scrollHeight( &scrollHeight  );  
    pElement->get_scrollWidth(  &scrollWidth  );  
    CSize  scrollSize(scrollWidth+30,  scrollHeight+30*2);  

    CRect rcNew(rcOld);
    rcNew.right=scrollSize.cx;
    rcNew.bottom=scrollSize.cy;
    // 关键位置,修改窗口大小
    // hWnd->MoveWindow(rcNew); CImage  image;
    image.Create(rcNew.Width(), rcNew.Height() ,32);// 创建图像

    RECT rcPic;// 绘制图像
    rcPic.left=0;
    rcPic.top=0;
    rcPic.right=image.GetWidth();
    rcPic.bottom = image.GetHeight();
    ViewObject->Draw(DVASPECT_CONTENT, -1, NULL, NULL, NULL, image.GetDC(), (LPCRECTL)(LPCRECT)&rcPic, NULL, NULL, NULL);
    if (ViewObject)
    {
    ViewObject->Release();
    ViewObject = NULL;
    }
    if (width>0)
    {
    CImage  image2;
    image2.Create(width,height,32);// 创建图像
    image.BitBlt(image2.GetDC(),0,0, width, height, x,y,SRCCOPY);
    image2.Save(lpszFileName);// 保存图像
    image2.ReleaseDC(); 
    }
    else
    {
    image.Save(lpszFileName);
    }
    image.ReleaseDC(); 
    LPTSTR lpsz =(LPTSTR)(LPCTSTR)lpszFileName; 
    if (ViewObject)
    {
    ViewObject->Release();
    ViewObject = NULL;
    }
    if(pElement!=NULL)
    pElement->Release();
    if(pBody!=NULL)
    pBody->Release();
    if(pDocument!=NULL)
    pDocument->Release();
    if (pDisp)
    {
    pDisp->Release();
    }
    // 还原窗口位置
    // hWnd->MoveWindow(&rcOld);
    goto BEGINLOOP;//保存成功,循环去保存下一个浏览器网页
    return mdeValue;
    return true;
    }大致代码,现在不要用MoveWindow直接存,图是黑的