`

[IE编程] IE网页截图技术总结

    博客分类:
  • IE
阅读更多

 

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

 

简单代码示例:

 

[c-sharp] view plaincopy
  1. IHTMLDocument3 *pDoc = ...;  //得到IHTMLDocument3指针  
  2. IHTMLElement *pDocElement = NULL;  
  3. pDoc->get_documentElement(&pDocElement );  
  4. IHTMLElementRender *pRender =  NULL;  
  5. pDocElement ->QueryInterface(IID_IHTMLElementRender, (void **) &pRender);  
  6. 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

 

简单代码示例:

 

[c-sharp] view plaincopy
  1. IHTMLDocument2* pDoc = ...;  // 得到IHTMLDocument2指针  
  2. IViewObject* pViewObject = NULL;  
  3. pDoc->QueryInterface(IID_IViewObject, (void**)pViewObject);  
  4. 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

 

简单代码示例:

 

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

 

 

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

缺点:

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

速度不如IHTMLElementRender::DrawToDC  

 

 

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

 

总结

 

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

更多信息请查看 java进阶网 http://www.javady.com

分享到:
评论

相关推荐

    最新ie编程web编程软件实现web通讯

    总结,实现“最新ie编程web编程软件实现web通讯”需要全面理解Web通讯的各种技术和IE的特性,通过兼容性处理、性能优化和安全措施,构建出能在IE上顺畅运行的Web应用。同时,持续关注Web技术的最新发展,以便及时...

    IE编程完全解决实例.rar

    总的来说,《IE编程完全解决实例》是一个全面的指南,旨在帮助开发者掌握IE插件的开发技术,通过VC++和Windows API实现对IE浏览器的定制化扩展。无论是初学者还是有经验的开发者,都能从中受益,提升自己在Web客户端...

    如何对webbrowser和IE编程

    在实际开发中,通过WebBrowser控件和IE编程,我们可以构建各种应用程序,如网页爬虫、自动化测试工具、自定义浏览器等。同时,为了实现更高级的功能,如用户登录、数据提交、模拟点击等,可能需要深入理解DOM...

    win下实现IE网页截屏

    在Windows操作系统中,如果你需要对Internet Explorer(IE)浏览器中的网页进行截图,通常可以借助一些工具或编程方式来实现。标题中的"win下实现IE网页截屏"指的是在Windows环境下利用特定方法或软件来捕获IE浏览器...

    IE WebBrowser编程技巧

    本WebBrowser编程技术包括Delphi、C#、VC++、VB等编程资料的集合,其中的 实例大多以Delphi为示例讲解,Delphi7 IDE开发环境。 IE_WebBrowser编程技巧 修改WebBrowser的header信息? Delphi查看...

    IE编程实例 删除IE相关历史记录

    在IE(Internet Explorer)编程中,有时候我们需要对用户的浏览历史记录进行操作,比如删除。这个实例就是关于如何使用C++编程来实现删除IE的历史记录。IE浏览器保存的浏览历史、临时互联网文件、Cookie等信息,可以...

    西门子Smart 1000 IE V3触摸屏编程实例

    总的来说,这个编程实例将带领我们一步步地掌握Smart 1000 IE V3触摸屏的使用,从图形设计到实际的系统集成,全面了解其在工业自动化中的应用。通过深入学习,我们可以有效地提升工厂的自动化水平,提高生产效率,...

    Delphi嵌套IE网页

    总结来说,"Delphi嵌套IE网页"是一种技术手段,通过Delphi的`WebBrowser`组件,结合JavaScript交互,实现应用内部的网页浏览功能,并且能进行特定的任务,如手机归属地查询。这种技术对于开发需要内嵌网页功能的应用...

    IE接口编程文档汇总

    IE接口编程文档的汇总,CHM格式 自动模拟点击HTML页面,自动提交表单等

    IE扩展编程与无窗口控件的开发

    总之,IE扩展编程与无窗口控件的开发是一门深奥的技术领域,涉及到对浏览器架构、COM原理以及Windows编程的深刻理解。开发者需要熟悉IE的各种接口和机制,才能有效地创建出稳定、高性能的扩展应用。无论是通过BHO...

    VC++ 控制IE网页操作

    在本主题"VC++ 控制IE网页操作"中,我们将探讨如何利用VC++来自动化和控制Internet Explorer(IE)浏览器的行为,以实现监控网络资源、获取网页内容以及处理网页链接等任务。 首先,我们要明白VC++如何与IE交互。这...

    CHAPTER I print.rar_Internet/IE编程_it

    标题中的"CHAPTER I print.rar"表明这是一个关于网络和IE编程的章节内容的压缩文件,而“Internet/IE编程_it”标签则明确了主题是与互联网和IE浏览器编程相关的IT技术。这个压缩包包含了一个名为"CHAPTER I print....

    IE编程实例 简单的浏览器的实现

    在IT领域,IE编程是指利用Internet Explorer的API接口来开发应用程序,通常是用于增强或扩展浏览器的功能。本实例是一个简单的浏览器的实现,它基于C++语言,通过解析HTML、处理网络请求以及显示网页内容来模拟IE...

    MAJF.zip_Internet/IE编程

    标题中的“MAJF.zip”是一个压缩包文件,其主题为“Internet/IE编程”,这意味着内容可能涉及到使用Internet Explorer浏览器进行的各种编程相关的技术、方法和问题。在Web开发领域,Internet Explorer曾是主流的...

    pzqr.rar_Internet/IE编程_版本管理

    标题中的“pzqr.rar”可能是一个压缩文件的名称,它涉及到的主题是“Internet/IE编程”和“版本管理”。这表明我们可能要讨论的是与互联网浏览器IE相关的编程技术和如何管理软件的不同版本。 “Internet/IE编程”是...

    IE.zip_IE_IE 插件_IE插件_c++操作IE_网页填表

    标题中的“IE.zip_IE_IE 插件_IE插件_c++操作IE_网页填表”表明这是一个关于使用C++编程语言开发的IE浏览器插件,主要功能集中在与网页交互,特别是网页填表。这个插件可能提供了对IE浏览器的深度控制,使得开发者...

    vc++IE编程

    删除IE相关历史记录【\chap4\DelHistory】 将应用程序加入到IE工具栏【\chap4\AddToToolBar】 超级链接的实现【\chap4\HyperLink】 禁止IE的弹出窗口【\chap4\StopPopup】 禁止浏览某些网站【\chap4\StopTravel】 IE...

    IE.zip_C# 操作网页_C#调用IE打开网页获取网页源代码_网页_网页操作_网页操作 C#

    本主题聚焦于如何利用C#与Internet Explorer(简称IE)浏览器进行交互,实现网页的操作和源代码的获取。这是一项关键的技术,特别是在自动化测试、数据抓取或模拟用户行为的场景下。 首先,我们要理解C#操作网页的...

    精彩编程与编程技巧-利用IE控件设计简易浏览器...

    此方法不仅适用于初学者,对于有一定编程基础的技术人员来说也是一种很好的实践方式。通过本教程,您将学习到如何使用Visual Basic 6.0进行开发,并掌握IE控件的基本操作及其事件处理。 #### 二、所需技术及工具 -...

    visual c++编程控制ie浏览器自动刷新,AutoRefresh.rar

    ActiveX控件是可以在网页或应用程序中嵌入的小型组件,IE浏览器支持ActiveX控件,使得我们可以用VC++创建一个控件来操纵浏览器的行为。在这个案例中,我们需要创建一个ActiveX控件,该控件能够与IE浏览器交互并执行...

Global site tag (gtag.js) - Google Analytics