试了多种方法依然没有截屏IE成功,人都瘦了!

wqvbka123 2010-01-22 08:56:28
本人试了多种方法截IE依然不成功,现在采用的方法是注入IE内部调用如何下方法 应该不存在跨进程问题了,该获得的都获得了,但是截的屏蔽是黑屏幕


ImageRender ir;
if (ir.CreateImage((int)cx, (int)cy))
{
HDC renderDC = ir.GetDC();
HDC BrowserDC = GetDC(hwnd); //这是IE窗口的句柄
RECTL rectl;
rectl.top = 0;
rectl.left = 0;
rectl.right = cx;
rectl.bottom = cy;

OutputDebugText("CreateImage成功");
if (renderDC != NULL)
{
DVASPECTINFO info;
info.cb = sizeof(info);
info.dwFlags = DVASPECTINFOFLAG_CANOPTIMIZE;
// draw screen snapshot.
//两种调用方法均不成功
hr = spViewObject->Draw(DVASPECT_CONTENT,-1,
&info,NULL,NULL,renderDC,&rectl,&rectl,NULL,0); //这是mic_lee2000提供的方法

//spViewObject->Draw(DVASPECT_CONTENT, 1,
NULL, NULL, BrowserDC, renderDC,
&rectl, NULL, NULL, 0);//这种方法CHtmlView中可以成功
ir.ReleaseDC();

OutputDebugText("创建磁盘文件");

if (!ir.SaveToFile(L"c:\\a1.jpg", &jpegClsid))
{
OutputDebugText(_T("Unable to save the JPEG image."));
return FALSE;
}
}
}


解决此问题另赠200分
谢谢你们啦!
...全文
293 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wqvbka123 2010-01-28
  • 打赏
  • 举报
回复
我的方法行不通,因为和IE 不是同一个线程,COM组件有跨线程的问题,不管怎么样谢谢大家
norsd 2010-01-24
  • 打赏
  • 举报
回复
http://blog.csdn.net/norsd/archive/2009/02/20/3914452.aspx
wqvbka123 2010-01-23
  • 打赏
  • 举报
回复
yxwsbobo 的方法可行,但是如果IE被遮住了,就截不到了,这不是我想要的方法,谢谢
wqvbka123 2010-01-23
  • 打赏
  • 举报
回复
jameshooo 三个贴子都回我了,谢谢啊,可否赐教你的代码的目的是干什么的?简单解释一下

TO:lllyyy2403 一定是哪儿不对,IE伴侣都可以实现截图,实在不行我就反网页保存下来再用WebBrowser打开就可以截,但是图片不好下载下来
jameshooo 2010-01-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wqvbka123 的回复:]
jameshooo 三个贴子都回我了,谢谢啊,可否赐教你的代码的目的是干什么的?简单解释一下

TO:lllyyy2403 一定是哪儿不对,IE伴侣都可以实现截图,实在不行我就反网页保存下来再用WebBrowser打开就可以截,但是图片不好下载下来
[/Quote]

看代码就知道,这个消息就是要求窗口将其内容绘制到你提供的DC里,整个绘制过程跟 WM_PAINT 完全一样,唯一的不同就是不需要调用 BeginPaint/EndPaint。
sjdev 2010-01-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wqvbka123 的回复:]
yxwsbobo 的方法可行,但是如果IE被遮住了,就截不到了,这不是我想要的方法,谢谢
[/Quote]

被遮住的窗口本应该无法获取吧。
yxwsbobo 2010-01-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jameshooo 的回复:]
C/C++ codeHDC my_hdc= ...;
::SendMessage(hwndBrowser, WM_PRINTCLIENT, (WPARAM)my_hdc, (LPARAM)PRF_CHILDREN| PRF_CLIENT| PRF_ERASEBKGND);
[/Quote]

你的方法是不是必须在一个进程内啊,学习一下这个消息




可以这样做,上午手边没工具,刚回家测试了一下也可以截取视频


HDC hdcClient, hdcWindow ;
HWND hWndToPrint;
static int cxClient, cyClient;
case WM_SIZE:
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
return 0 ;

case WM_PAINT:
hdcClient = BeginPaint (hwnd, &ps) ;
hWndToPrint = FindWindow(TEXT("MozillaUIWindowClass"),NULL);//获取窗口句柄,ie是 IEFrame
hdcWindow = GetWindowDC (hWndToPrint) ;//获取窗口设备描述句柄
BitBlt(hdcClient,0,0,cxClient,cyClient,hdcWindow,0,0,SRCCOPY);
ReleaseDC (hwnd, hdcWindow) ;
EndPaint (hwnd, &ps) ;
return 0 ;


wshcdr 2010-01-23
  • 打赏
  • 举报
回复
up
djjs280 2010-01-22
  • 打赏
  • 举报
回复
原来研究IE截屏能减肥啊,赶紧去试下
yxwsbobo 2010-01-22
  • 打赏
  • 举报
回复
搜了一下 是 BitBlt 竟然开头字母都记错了 哎 一个礼拜玩的啥都忘了


BitBlt是直接获取屏幕上的像素的 所以肯定能截取到
yxwsbobo 2010-01-22
  • 打赏
  • 举报
回复

GetDC(NULL) 获取屏幕DC设备

然后获取IE 所在位置和窗口大小

然后 。。。。 书不在旁边忘了函数名字了。。。 悲剧

有一个函数可以将一个图形设备上的内容拷贝到另一个图形设备,是S开头的。。。。。


恩 就这样。。。
lllyyy2403 2010-01-22
  • 打赏
  • 举报
回复
既然反复试了都不成功,也许你需要换种思路或另行使用其它方法。VC不是可以抓获网页文件吗?抓获网页文件并保存不就是你需要的IE网页吗?
jameshooo 2010-01-22
  • 打赏
  • 举报
回复
HDC my_hdc = ...;
::SendMessage(hwndBrowser, WM_PRINTCLIENT, (WPARAM)my_hdc, (LPARAM)PRF_CHILDREN | PRF_CLIENT | PRF_ERASEBKGND);
__lhy 2010-01-22
  • 打赏
  • 举报
回复
我是看标题进来的...
wqvbka123 2010-01-22
  • 打赏
  • 举报
回复
if ( _tcscmp( buff, _T("Internet Explorer_Server") ) == 0 ){

OutputDebugText("找到IE窗口");

IPersistFile *piPF = (IPersistFile *)NULL;
CComPtr<IHTMLDocument2> spDoc;
spDoc = GetDocInterface(hwnd);

OutputDebugText("IHTMLDocument2 is:%x",spDoc);
}
我截取的窗口句柄类名为 Internet Explorer_Server 的窗口句柄。

如果有知道的,可以联系我QQ:yangqing56@qq.com
wqvbka123 2010-01-22
  • 打赏
  • 举报
回复
在线等~~~~~

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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