我想在CWebBrowser2控件里跳转到一个网页
并分析网页里的一个验证码图片,
有什么办法直接获取这个图片吗?
谢谢

解决方案 »

  1.   

    先得到元素然后复制到剪切板,然后以bmp的格式从剪切板读出.
    http://support.microsoft.com/kb/293125
      

  2.   

    IHTMLDocument2* pDoc = NULL;
          IHTMLElement* pelmBody = NULL;
          IHTMLElement2* pelmBodyTwo = NULL;
          IDispatch* pdispImgElement = NULL;
          IDispatch* pdispCtrlRange = NULL;
          IHTMLElementCollection* pColl = NULL;
          IHTMLControlElement* pCtrlElement = NULL;
          IHTMLControlRange* pCtrlRange = NULL;
          BSTR bstrCommand = SysAllocString(L"Copy");
          VARIANT_BOOL vbReturn;
          VARIANT vEmpty;
      VARIANT vImageID;
      VariantInit(&vImageID);
      vImageID.vt = VT_UINT;
      vImageID.lVal = EleIndex;
          VariantInit(&vEmpty);
      m_CtrlWeb.Stop();
      pNewDisp = m_CtrlWeb.get_Document();
      if (FAILED(pNewDisp->QueryInterface(IID_IHTMLDocument2, (void**) &pDoc)))
             MessageBox(_T("1"));
      if (FAILED(pHTMLDocument.p->get_all(&pColl)))
             MessageBox(_T("2"));
      if (FAILED(pColl->item(vImageID, vEmpty, &pdispImgElement)) 
                || pdispImgElement == NULL)
             MessageBox(_T("3"));
          if (FAILED(pHTMLDocument.p->get_body(&pelmBody)) || pelmBody == NULL)
             MessageBox(_T("4"));
          if (FAILED(pelmBody->QueryInterface(IID_IHTMLElement2, (void**) &pelmBodyTwo)) 
                || pelmBodyTwo == NULL)
             MessageBox(_T("5"));
          if (FAILED(pelmBodyTwo->createControlRange(&pdispCtrlRange)) 
                || pdispCtrlRange == NULL)
             MessageBox(_T("6"));
          if (FAILED(pdispCtrlRange->QueryInterface(IID_IHTMLControlRange, (void**) &pCtrlRange)) 
                || pCtrlRange == NULL)
             MessageBox(_T("7"));
          if (FAILED(pdispImgElement->QueryInterface(IID_IHTMLControlElement, (void**) &pCtrlElement)) 
                || pCtrlElement == NULL)
             MessageBox(_T("8"));

          hr = pCtrlRange->add(pCtrlElement);
          if (SUCCEEDED(hr))
      {
             hr = pCtrlRange->execCommand(bstrCommand, VARIANT_FALSE, vEmpty, &vbReturn); 
     if(SUCCEEDED(hr))
     MessageBox(_T("9"));
      }
      HWND hWnd = GetSafeHwnd(); // 获取安全窗口句柄
      HANDLE sBit;   OpenClipboard();
      HANDLE hBitmap = GetClipboardData(CF_BITMAP); // 获取剪贴板数据句柄
      HDC hDC = ::GetDC(hWnd); // 获取设备环境句柄
      HDC hdcMem = CreateCompatibleDC(hDC); // 创建与设备相关的内存环境
      SelectObject(hdcMem, hBitmap); // 选择对象
      SetMapMode(hdcMem, GetMapMode(hDC)); // 设置映射模式
      BITMAP bm; // 得到位图对象
      GetObject(hBitmap, sizeof(BITMAP), &bm);
      BitBlt(hDC, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);    ::ReleaseDC(hWnd, hDC); 
      DeleteDC(hdcMem); 
      CloseClipboard();
      

  3.   

    你分析下含有验证码图片的html文件,找出可以唯一表示验证码的信息特征,通过上述代码把图片找出来复制到剪切板,然后从剪切板里读出来。就仿照微软官方的技术文档做。直接复制过去肯定不好用。