苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 8462|回复: 7

[其他] 关于webbrowser的截图问题

[复制链接]
发表于 2013-8-26 16:46:43 | 显示全部楼层 |阅读模式
我用SHDocVw.InternetExplorer IE = new InternetExplorer();方法,把IE浏览器调出来了,让它访问了一个网站,现在想对整个浏览器进行截图,如下图,包括状态栏、地址栏,以及下面的页面内容。而且需要在获取ie句柄的情况下进行拷屏。


无标题.png


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-8-26 16:53:29 | 显示全部楼层
这个我给你提供个思路,其实你可以这样估,让你的浏览器全屏,直接截屏就行。
当然这种方法有点太幼稚了,呵呵
你现在的问题是什么,是一点也没有实现,当然除了打外浏览器之前的操作,
还是实现了一部分,能得到句柄吗?如果能应该是可以自己绘图的。

 楼主| 发表于 2013-8-26 17:26:52 | 显示全部楼层
站长苏飞 发表于 2013-8-26 16:53
这个我给你提供个思路,其实你可以这样估,让你的浏览器全屏,直接截屏就行。
当然这种方法有点太幼稚了, ...

我在网上找了一些代码,可以获得页面里的整个图片,但是我想获得包括地址栏在内的整个浏览器显示的内容,分屏把这一url中的内容截取下来。
如下图所示,进行多屏拷贝。
原先 别人程序中采用using (Bitmap bmp = snap.TakeSnapshot(this.webBrowser.ActiveXInstance, new Rectangle(0, 0, width, height)))
我换成 using (Bitmap bmp = snap.TakeSnapshot(IE, new Rectangle(0, 0, width, height)))
总是报错
  1. public Bitmap TakeSnapshot(object pUnknown, Rectangle bmpRect)
  2.         {
  3.             if (pUnknown == null)
  4.                 return null;
  5.             //必须为com对象
  6.             if (!Marshal.IsComObject(pUnknown))
  7.                 return null;
  8.             //IViewObject 接口
  9.             SnapLibrary.UnsafeNativeMethods.IViewObject ViewObject = null;
  10.             IntPtr pViewObject = IntPtr.Zero;
  11.             //内存图
  12.             Bitmap pPicture = new Bitmap(bmpRect.Width, bmpRect.Height);
  13.             Graphics hDrawDC = Graphics.FromImage(pPicture);
  14.             //获取接口
  15.             object hret = Marshal.QueryInterface(Marshal.GetIUnknownForObject(pUnknown),
  16.                 ref UnsafeNativeMethods.IID_IViewObject, out pViewObject);
  17.             try
  18.             {
  19.                 ViewObject = Marshal.GetTypedObjectForIUnknown(pViewObject, typeof(SnapLibrary.UnsafeNativeMethods.IViewObject)) as SnapLibrary.UnsafeNativeMethods.IViewObject;
  20.                 //调用Draw方法
  21.                 ViewObject.Draw((int)DVASPECT.DVASPECT_CONTENT,
  22.                     -1,
  23.                     IntPtr.Zero,
  24.                     null,
  25.                     IntPtr.Zero,
  26.                     hDrawDC.GetHdc(),
  27.                     new NativeMethods.COMRECT(bmpRect),
  28.                     null,
  29.                     IntPtr.Zero,
  30.                     0);
  31.                 Marshal.Release(pViewObject);
  32.             }
  33.             catch (Exception ex)
  34.             {
  35.                 Console.WriteLine(ex.Message);
  36.                 throw ex;
  37.             }
  38.             //释放
  39.             hDrawDC.Dispose();
  40.             return pPicture;
  41.         }
复制代码
更多图片 小图 大图
组图打开中,请稍候......
 楼主| 发表于 2013-8-26 17:36:23 | 显示全部楼层
站长苏飞 发表于 2013-8-26 16:53
这个我给你提供个思路,其实你可以这样估,让你的浏览器全屏,直接截屏就行。
当然这种方法有点太幼稚了, ...

附近为我少做修改后的程序

test.rar

608.76 KB, 下载次数: 217, 下载积分: 金钱 -1

发表于 2013-8-26 17:55:36 | 显示全部楼层
报的什么错误,
明天看吧,今天太晚了,马上下班了。
 楼主| 发表于 2013-8-26 17:56:17 | 显示全部楼层
站长苏飞 发表于 2013-8-26 16:53
这个我给你提供个思路,其实你可以这样估,让你的浏览器全屏,直接截屏就行。
当然这种方法有点太幼稚了, ...

或者有什么办法能够让SHDocVw.InternetExplorer IE = new InternetExplorer(),能够让IE为最当前屏幕最上方,我用类似qq拷屏的方式对它进行拷屏?
 楼主| 发表于 2013-8-26 17:59:19 | 显示全部楼层
站长苏飞 发表于 2013-8-26 17:55
报的什么错误,
明天看吧,今天太晚了,马上下班了。

ViewObject = Marshal.GetTypedObjectForIUnknown(pViewObject, typeof(SnapLibrary.UnsafeNativeMethods.IViewObject)) as SnapLibrary.UnsafeNativeMethods.IViewObject; 进行抛异常
+        $exception    {"值不能为空。\r\n参数名: pUnk"}    System.Exception {System.ArgumentNullException}


发表于 2013-8-26 18:04:15 | 显示全部楼层
SHDocVw.InternetExplorer IE = new InternetExplorer()
你看看IE还有没有其他属性,IE.一下看看,
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-27 20:54

© 2014-2021

快速回复 返回顶部 返回列表