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; }
是我用法错了吗? 还是怎么回事? 谢谢各位
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; }
是我用法错了吗? 还是怎么回事? 谢谢各位
pWeb应该是一个HWND类型,看你的命名好像不对。是不是
hr = spBrowser->get_HWND((long*)&hWnd);
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();
}
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直接存,图是黑的