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 = ...;
- 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 = ...;
- 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 = ...;
- HWND hTridentWnd= NULL;
- IOleWindow* pOleWin = NULL;
- pIWebBrowser2->QueryInterface(IID_PPV_ARGS(&pOleWin));
- pOleWin->GetWindow(&hTridentWnd);
- ::PrintWindow(hTridentWnd, hImageDC, PW_CLIENTONLY);
优点: 内容完整,就算ActiveX没有实现IViewObject接口,也会被截图。
缺点:
只能按目前屏幕显示大小截取,不支持缩放;
速度不如IHTMLElementRender::DrawToDC
注:以上代码示例都是简化版,实际使用请检查函数返回值以及指针有效性。
总结
综合考虑, PrintWindow 是首选, 简单而且内容完整。 如果你希望得到缩放的结果,那选择IViewObject::Draw。 如果你想要对特定某个元素截图, 那选择IHTMLElementRender::DrawToDC。
更多信息请查看 java进阶网 http://www.javady.com
分享到:
相关推荐
总结,实现“最新ie编程web编程软件实现web通讯”需要全面理解Web通讯的各种技术和IE的特性,通过兼容性处理、性能优化和安全措施,构建出能在IE上顺畅运行的Web应用。同时,持续关注Web技术的最新发展,以便及时...
总的来说,《IE编程完全解决实例》是一个全面的指南,旨在帮助开发者掌握IE插件的开发技术,通过VC++和Windows API实现对IE浏览器的定制化扩展。无论是初学者还是有经验的开发者,都能从中受益,提升自己在Web客户端...
在实际开发中,通过WebBrowser控件和IE编程,我们可以构建各种应用程序,如网页爬虫、自动化测试工具、自定义浏览器等。同时,为了实现更高级的功能,如用户登录、数据提交、模拟点击等,可能需要深入理解DOM...
在Windows操作系统中,如果你需要对Internet Explorer(IE)浏览器中的网页进行截图,通常可以借助一些工具或编程方式来实现。标题中的"win下实现IE网页截屏"指的是在Windows环境下利用特定方法或软件来捕获IE浏览器...
本WebBrowser编程技术包括Delphi、C#、VC++、VB等编程资料的集合,其中的 实例大多以Delphi为示例讲解,Delphi7 IDE开发环境。 IE_WebBrowser编程技巧 修改WebBrowser的header信息? Delphi查看...
在IE(Internet Explorer)编程中,有时候我们需要对用户的浏览历史记录进行操作,比如删除。这个实例就是关于如何使用C++编程来实现删除IE的历史记录。IE浏览器保存的浏览历史、临时互联网文件、Cookie等信息,可以...
总的来说,这个编程实例将带领我们一步步地掌握Smart 1000 IE V3触摸屏的使用,从图形设计到实际的系统集成,全面了解其在工业自动化中的应用。通过深入学习,我们可以有效地提升工厂的自动化水平,提高生产效率,...
总结来说,"Delphi嵌套IE网页"是一种技术手段,通过Delphi的`WebBrowser`组件,结合JavaScript交互,实现应用内部的网页浏览功能,并且能进行特定的任务,如手机归属地查询。这种技术对于开发需要内嵌网页功能的应用...
IE接口编程文档的汇总,CHM格式 自动模拟点击HTML页面,自动提交表单等
总之,IE扩展编程与无窗口控件的开发是一门深奥的技术领域,涉及到对浏览器架构、COM原理以及Windows编程的深刻理解。开发者需要熟悉IE的各种接口和机制,才能有效地创建出稳定、高性能的扩展应用。无论是通过BHO...
在本主题"VC++ 控制IE网页操作"中,我们将探讨如何利用VC++来自动化和控制Internet Explorer(IE)浏览器的行为,以实现监控网络资源、获取网页内容以及处理网页链接等任务。 首先,我们要明白VC++如何与IE交互。这...
标题中的"CHAPTER I print.rar"表明这是一个关于网络和IE编程的章节内容的压缩文件,而“Internet/IE编程_it”标签则明确了主题是与互联网和IE浏览器编程相关的IT技术。这个压缩包包含了一个名为"CHAPTER I print....
在IT领域,IE编程是指利用Internet Explorer的API接口来开发应用程序,通常是用于增强或扩展浏览器的功能。本实例是一个简单的浏览器的实现,它基于C++语言,通过解析HTML、处理网络请求以及显示网页内容来模拟IE...
标题中的“MAJF.zip”是一个压缩包文件,其主题为“Internet/IE编程”,这意味着内容可能涉及到使用Internet Explorer浏览器进行的各种编程相关的技术、方法和问题。在Web开发领域,Internet Explorer曾是主流的...
标题中的“pzqr.rar”可能是一个压缩文件的名称,它涉及到的主题是“Internet/IE编程”和“版本管理”。这表明我们可能要讨论的是与互联网浏览器IE相关的编程技术和如何管理软件的不同版本。 “Internet/IE编程”是...
标题中的“IE.zip_IE_IE 插件_IE插件_c++操作IE_网页填表”表明这是一个关于使用C++编程语言开发的IE浏览器插件,主要功能集中在与网页交互,特别是网页填表。这个插件可能提供了对IE浏览器的深度控制,使得开发者...
删除IE相关历史记录【\chap4\DelHistory】 将应用程序加入到IE工具栏【\chap4\AddToToolBar】 超级链接的实现【\chap4\HyperLink】 禁止IE的弹出窗口【\chap4\StopPopup】 禁止浏览某些网站【\chap4\StopTravel】 IE...
本主题聚焦于如何利用C#与Internet Explorer(简称IE)浏览器进行交互,实现网页的操作和源代码的获取。这是一项关键的技术,特别是在自动化测试、数据抓取或模拟用户行为的场景下。 首先,我们要理解C#操作网页的...
此方法不仅适用于初学者,对于有一定编程基础的技术人员来说也是一种很好的实践方式。通过本教程,您将学习到如何使用Visual Basic 6.0进行开发,并掌握IE控件的基本操作及其事件处理。 #### 二、所需技术及工具 -...
ActiveX控件是可以在网页或应用程序中嵌入的小型组件,IE浏览器支持ActiveX控件,使得我们可以用VC++创建一个控件来操纵浏览器的行为。在这个案例中,我们需要创建一个ActiveX控件,该控件能够与IE浏览器交互并执行...