IE网页截图是IE编程中的经典问题。 IE9 beta发布之后我收到很多关于这方面的问题。 最近我把IE和Windows中这部分相关的代码重新架构了一下,使它们能够在IE9开启硬件加速的情况下完美兼容原来GDI函数。 趁着记忆还fresh, 写一个总结以供大家参考。

主要有以下3个接口可以实现IE网页截图。

1) HRESULT IHTMLElementRender::DrawToDC(HDC hDC)

MSDN参考: http://msdn.microsoft.com/en-us/library/aa752273(VS.85).aspx

简单代码示例:

IHTMLDocument3 *pDoc = ...; //得到IHTMLDocument3指针 IHTMLElement *pDocElement = NULL; pDoc->get_documentElement(&pDocElement ); IHTMLElementRender *pRender = NULL; pDocElement ->QueryInterface(IID_IHTMLElementRender, (void **) &pRender); pDocElement->DrawToDC(hImageDC);

注意事项: Quirks 模式下,documentElement不存在, 请使用BODY元素。

优点: 可以画某个特定的HTML元素

缺点:

需要判断是不是Quirks模式下,进而决定拿documentElement元素还是BODY元素的的指针;

只能按目前屏幕显示大小截取,不支持缩放;

在有些情况就是当网页由frames 组成或者是个内嵌的doc/pdf文档,该可能会失败;

2) HRESULT IViewObject::Draw( DWORD dwAspect, LONG lindex,  void * pvAspect, DVTARGETDEVICE * ptd, HDC hicTargetDev, HDC hdcDraw,  const LPRECTL lprcBounds,
const LPRECTL lprcWBounds, BOOL (*) (DWORD) pfnContinue, DWORD dwContinue )

MSDN参考:http://msdn.microsoft.com/en-us/library/ms688655(VS.85).aspx

简单代码示例:

IHTMLDocument2* pDoc = ...; // 得到IHTMLDocument2指针 IViewObject* pViewObject = NULL; pDoc->QueryInterface(IID_IViewObject, (void**)pViewObject); pViewObject->(DVASPECT_CONTENT, 1, NULL, NULL, hScreenDC, hImageDC, rcSource, NULL, NULL, 0);

优点: 可以缩放,IE会根据传入的lprcBounds自行缩放图片。

缺点:

因为要计算缩放,速度会较慢;

截取整个文档的可见区域,没法截取特定的元素

有些第三方的ActiveX没有实现IViewObject接口,导致那些ActiveX没有出现在截图里面。

3) BOOL PrintWindow( hwnd,  HDC hdcBlt,  nFlags)

MSDN参考:http://msdn.microsoft.com/en-us/library/dd162869(VS.85).aspx

简单代码示例:

IWebBrowser2* pIWebBrowser2 = ...; // 得到IWebBrowser2指针 HWND hTridentWnd= NULL; IOleWindow* pOleWin = NULL; pIWebBrowser2->QueryInterface(IID_PPV_ARGS(&pOleWin)); pOleWin->GetWindow(&hTridentWnd); // 得到Trident窗口handle (类名"Internet Explorer_Server") ::PrintWindow(hTridentWnd, hImageDC, PW_CLIENTONLY);

优点: 内容完整,就算ActiveX没有实现IViewObject接口,也会被截图。

缺点:

只能按目前屏幕显示大小截取,不支持缩放;

速度不如IHTMLElementRender::DrawToDC

注:以上代码示例都是简化版,实际使用请检查函数返回值以及指针有效性。

总结

综合考虑, PrintWindow 是首选, 简单而且内容完整。 如果你希望得到缩放的结果,那选择IViewObject::Draw。 如果你想要对特定某个元素截图, 那选择IHTMLElementRender::DrawToDC。

>> 原创文章的版权属于作者,转载请注明出处(http://blog.csdn.net/WinGeek/), 谢谢。 <<

转载于:https://www.cnblogs.com/ajuanabc/archive/2010/12/10/2462576.html

[IE编程] IE网页截图技术总结相关推荐

  1. java web 截图_如何以Java实现网页截图技术

    今天看到某网友关于"如何以Java实现网页截图技术"的咨询帖,由于出现该咨询的地点非常不适合较长回复,故以博文形式回答. 事实上,如果您想以Java实现网页截图,也就是" ...

  2. IE网页截图技术笔记

    网页截图技术似乎并不是很复杂,网上有很多实例,但是真的想搞清楚的话,还是有很多细节需要注意的.下面是我个人一些经验总结. 有3个技术方案,可以实现IE截图 这篇博客(http://blog.csdn. ...

  3. 如何以Java实现网页截图技术

    今天看到某网友关于"如何以Java实现网页截图技术"的咨询帖,由于出现该咨询的地点非常不适合较长回复,故以博文形式回答. 事实上,如果您想以Java实现网页截图,也就是" ...

  4. java webengine_如何以Java实现网页截图技术

    展开全部 使用JavaFX8(JDK8打包在一起) public void start(Stage primaryStage) throws Exception { final WebView vie ...

  5. 如何以Java实现网页截图技术,根据URL得到网页快照

    // 此方法仅适用于JdK1.6及以上版本 Desktop.getDesktop().browse( new URL("http://www.csdn.net/").toURI() ...

  6. 使用PhantomJS实现网页截图服务

    使用PhantomJS实现网页截图服务 2015-12-12来源:Java教程人气:99 这是上半年遇到的一个小需求,想实现网页的抓取,并保存为图片.研究了不少工具,效果都不理想,不是显示太差了(Ca ...

  7. Python动态网页爬虫技术

    这一讲,我将会为大家讲解稍微复杂一点的爬虫,即动态网页的爬虫. 动态网页技术介绍 动态网页爬虫技术一之API请求法 动态网页爬虫技术二之模拟浏览器法 安装selenium模块下载 Google Chr ...

  8. html2canvas 一个强大的使用js开发的浏览器网页截图工具

    html2canvas是一个JavaScript类库,它使用了html5和css3的一些新功能特性,实现了在客户端对网页进行截图的功 能.html2canvas通过获取页面的DOM和元素的样式信息,并 ...

  9. [IE9] 解决了傲游、搜狗浏览器在IE9下网页截图的问题

    因为IE9直接使用硬件图形接口D2D/DWrite进行网页渲染,所以使用基于GDI的函数访问IE9的时候会出现问题. 目前国内的浏览器(如:傲游,搜狗)都是使用GDI函数来实现网页截图的, 当IE内核 ...

最新文章

  1. 从大规模文献库中实现生物医学关系抽取
  2. thinkphp整合极验滑动验证码源码演示下载
  3. VMware排错:Number of virtual devices exceeds the maximum for a given controller
  4. 利用线性链表基本操作完成两个有序线性表的合并
  5. web(七)---fastcgi再进阶(请求和响应)官方例子
  6. 使用 Task 简化异步编程
  7. 最速下降法极小化rosenbrock函数 代码_典型算法思想与应用9|分支限界法与电路布线问题
  8. [转]IIS状态代码的含义
  9. 3dmax间隔阵列怎么用
  10. DSXX平台MCU升级过程研究2014.10.05
  11. 猿编程 python_猿编程客户端下载_猿编程(小学阶段编程课程学习专用) 1.5.2 官方版_极速下载站...
  12. 产品经理必会知识:万字长文 | 史上最全的付费会员体系分析
  13. 信息检索1.3.学术搜索引擎--谷歌学术搜索引擎
  14. python人机猜拳随机,python实现人机猜拳小游戏
  15. Vue最佳实践(项目经验总结,定期更新)
  16. 运筹说 第50期 | 图解法与单纯形法解目标规划
  17. 老照片修复清晰?父母以前的老照片还能修复吗?
  18. 计算机如何连接wifi台式,台式电脑怎么连接WIFI上网?台式电脑连接无线网络的方法...
  19. Linux信号处理简析
  20. Html5--audio标签使用教程

热门文章

  1. 微信预约叫好服务器,微信预约排队系统 智能排队机系统 智能叫号机系统
  2. python笔记:4.2.2对订单明细表的一部分操作
  3. 蓝桥杯 试题 算法提高 P0402 猴子吃桃问题 Java
  4. 零基础学Python(二)
  5. 菜鸟PWN手进阶之堆基础
  6. 轻量级3d模型查看器_NVIDIA这是要统领3D软件了么?感觉一股强大冲击波~
  7. 2022年 HSC-1th中MISC的DORAEMON
  8. 每日IN语(2009-01-12)喝醉了我谁也不服
  9. python为txt添加表头_使用将标题行添加到多个.txt文件
  10. 荷兰Flexible Optical B.V (OKO)公司