通过IViewObject接口,取浏览器的图象,实现SNAP

通过IViewObject接口,取浏览器的图象,实现SNAP

今天又见到snap实现的文章,看来对此感兴趣的人挺多的.实现这个功能确实很'眩',我也来做一个把玩一下.
我的做法不是 Control.DrawToBitmap ,而是直接QueryInterface 浏览器Com对象的 IViewObject 接口,用它实现的Draw方法,画到图象上.

首先定义IViewObject的接口声名,如下:
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAPIVewObject接口声明
通过IViewObject接口,取浏览器的图象,实现SNAPusing System;
通过IViewObject接口,取浏览器的图象,实现SNAPusing System.Collections.Generic;
通过IViewObject接口,取浏览器的图象,实现SNAPusing System.Text;
通过IViewObject接口,取浏览器的图象,实现SNAPusing System.Security;
通过IViewObject接口,取浏览器的图象,实现SNAPusing System.Runtime.InteropServices;
通过IViewObject接口,取浏览器的图象,实现SNAPusing System.Runtime.InteropServices.ComTypes;
通过IViewObject接口,取浏览器的图象,实现SNAP
通过IViewObject接口,取浏览器的图象,实现SNAPnamespace SnapLibrary
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP/**//// <summary>
通过IViewObject接口,取浏览器的图象,实现SNAP
/// 从 .Net 2.0 的 System.Windows.Forms.Dll 库提取
通过IViewObject接口,取浏览器的图象,实现SNAP
/// 版权所有:微软公司
通过IViewObject接口,取浏览器的图象,实现SNAP
/// </summary>

通过IViewObject接口,取浏览器的图象,实现SNAP [SuppressUnmanagedCodeSecurity]
通过IViewObject接口,取浏览器的图象,实现SNAPinternal static class UnsafeNativeMethods
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAPpublic static Guid IID_IViewObject = new Guid("{0000010d-0000-0000-C000-000000000046}");
通过IViewObject接口,取浏览器的图象,实现SNAP
通过IViewObject接口,取浏览器的图象,实现SNAP [ComImport, Guid("0000010d-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
通过IViewObject接口,取浏览器的图象,实现SNAPpublic interface IViewObject
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP [PreserveSig]
通过IViewObject接口,取浏览器的图象,实现SNAPint Draw([In, MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, [In] NativeMethods.tagDVTARGETDEVICE ptd, IntPtr hdcTargetDev, IntPtr hdcDraw, [In] NativeMethods.COMRECT lprcBounds, [In] NativeMethods.COMRECT lprcWBounds, IntPtr pfnContinue, [In] int dwContinue);
通过IViewObject接口,取浏览器的图象,实现SNAP [PreserveSig]
通过IViewObject接口,取浏览器的图象,实现SNAPint GetColorSet([In, MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, [In] NativeMethods.tagDVTARGETDEVICE ptd, IntPtr hicTargetDev, [Out] NativeMethods.tagLOGPALETTE ppColorSet);
通过IViewObject接口,取浏览器的图象,实现SNAP [PreserveSig]
通过IViewObject接口,取浏览器的图象,实现SNAPint Freeze([In, MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, [Out] IntPtr pdwFreeze);
通过IViewObject接口,取浏览器的图象,实现SNAP [PreserveSig]
通过IViewObject接口,取浏览器的图象,实现SNAPint Unfreeze([In, MarshalAs(UnmanagedType.U4)] int dwFreeze);
通过IViewObject接口,取浏览器的图象,实现SNAPvoid SetAdvise([In, MarshalAs(UnmanagedType.U4)] int aspects, [In, MarshalAs(UnmanagedType.U4)] int advf, [In, MarshalAs(UnmanagedType.Interface)] IAdviseSink pAdvSink);
通过IViewObject接口,取浏览器的图象,实现SNAPvoid GetAdvise([In, Out, MarshalAs(UnmanagedType.LPArray)] int[] paspects, [In, Out, MarshalAs(UnmanagedType.LPArray)] int[] advf, [In, Out, MarshalAs(UnmanagedType.LPArray)] IAdviseSink[] pAdvSink);
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP}

通过IViewObject接口,取浏览器的图象,实现SNAP

该接口.net 自己带了,只是internal形式,所以只有想办法用Reflector 将它弄出来,相关的还有几个类,分别是tagLOGPALETTE,COMRECT,tagDVTARGETDEVICE.
定义如下:
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP相关定义
通过IViewObject接口,取浏览器的图象,实现SNAPusing System;
通过IViewObject接口,取浏览器的图象,实现SNAPusing System.Collections.Generic;
通过IViewObject接口,取浏览器的图象,实现SNAPusing System.Text;
通过IViewObject接口,取浏览器的图象,实现SNAPusing System.Runtime.InteropServices;
通过IViewObject接口,取浏览器的图象,实现SNAPusing System.Drawing;
通过IViewObject接口,取浏览器的图象,实现SNAP
通过IViewObject接口,取浏览器的图象,实现SNAPnamespace SnapLibrary
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP/**//// <summary>
通过IViewObject接口,取浏览器的图象,实现SNAP
/// 从 .Net 2.0 的 System.Windows.Forms.Dll 库提取
通过IViewObject接口,取浏览器的图象,实现SNAP
/// 版权所有:微软公司
通过IViewObject接口,取浏览器的图象,实现SNAP
/// </summary>

通过IViewObject接口,取浏览器的图象,实现SNAPinternal static class NativeMethods
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP [StructLayout(LayoutKind.Sequential)]
通过IViewObject接口,取浏览器的图象,实现SNAPpublic sealed class tagDVTARGETDEVICE
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP [MarshalAs(UnmanagedType.U4)]
通过IViewObject接口,取浏览器的图象,实现SNAPpublic int tdSize;
通过IViewObject接口,取浏览器的图象,实现SNAP [MarshalAs(UnmanagedType.U2)]
通过IViewObject接口,取浏览器的图象,实现SNAPpublic short tdDriverNameOffset;
通过IViewObject接口,取浏览器的图象,实现SNAP [MarshalAs(UnmanagedType.U2)]
通过IViewObject接口,取浏览器的图象,实现SNAPpublic short tdDeviceNameOffset;
通过IViewObject接口,取浏览器的图象,实现SNAP [MarshalAs(UnmanagedType.U2)]
通过IViewObject接口,取浏览器的图象,实现SNAPpublic short tdPortNameOffset;
通过IViewObject接口,取浏览器的图象,实现SNAP [MarshalAs(UnmanagedType.U2)]
通过IViewObject接口,取浏览器的图象,实现SNAPpublic short tdExtDevmodeOffset;
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP
通过IViewObject接口,取浏览器的图象,实现SNAP [StructLayout(LayoutKind.Sequential)]
通过IViewObject接口,取浏览器的图象,实现SNAPpublic class COMRECT
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAPpublic int left;
通过IViewObject接口,取浏览器的图象,实现SNAPpublic int top;
通过IViewObject接口,取浏览器的图象,实现SNAPpublic int right;
通过IViewObject接口,取浏览器的图象,实现SNAPpublic int bottom;
通过IViewObject接口,取浏览器的图象,实现SNAPpublic COMRECT()
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP
通过IViewObject接口,取浏览器的图象,实现SNAPpublic COMRECT(Rectangle r)
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAPthis.left = r.X;
通过IViewObject接口,取浏览器的图象,实现SNAPthis.top = r.Y;
通过IViewObject接口,取浏览器的图象,实现SNAPthis.right = r.Right;
通过IViewObject接口,取浏览器的图象,实现SNAPthis.bottom = r.Bottom;
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP
通过IViewObject接口,取浏览器的图象,实现SNAPpublic COMRECT(int left, int top, int right, int bottom)
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAPthis.left = left;
通过IViewObject接口,取浏览器的图象,实现SNAPthis.top = top;
通过IViewObject接口,取浏览器的图象,实现SNAPthis.right = right;
通过IViewObject接口,取浏览器的图象,实现SNAPthis.bottom = bottom;
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP
通过IViewObject接口,取浏览器的图象,实现SNAPpublic static NativeMethods.COMRECT FromXYWH(int x, int y, int width, int height)
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAPreturn new NativeMethods.COMRECT(x, y, x + width, y + height);
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP
通过IViewObject接口,取浏览器的图象,实现SNAPpublic override string ToString()
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAPreturn string.Concat(new object[] 通过IViewObject接口,取浏览器的图象,实现SNAP{ "Left = ", this.left, " Top ", this.top, " Right = ", this.right, " Bottom = ", this.bottom });
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP
通过IViewObject接口,取浏览器的图象,实现SNAP [StructLayout(LayoutKind.Sequential)]
通过IViewObject接口,取浏览器的图象,实现SNAPpublic sealed class tagLOGPALETTE
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP [MarshalAs(UnmanagedType.U2)]
通过IViewObject接口,取浏览器的图象,实现SNAPpublic short palVersion;
通过IViewObject接口,取浏览器的图象,实现SNAP [MarshalAs(UnmanagedType.U2)]
通过IViewObject接口,取浏览器的图象,实现SNAPpublic short palNumEntries;
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP}

通过IViewObject接口,取浏览器的图象,实现SNAP

现在可以通过 Marshal.QueryInterface 将浏览器COM实例的IViewObject接口取出:
通过IViewObject接口,取浏览器的图象,实现SNAP//获取接口
通过IViewObject接口,取浏览器的图象,实现SNAP
object hret = Marshal.QueryInterface(Marshal.GetIUnknownForObject(pUnknown),ref UnsafeNativeMethods.IID_IViewObject, out pViewObject);
pUnknown为 com对象实例.

将IViewObject 指针对象 pViewObject 转化为接口对象.
通过IViewObject接口,取浏览器的图象,实现SNAPViewObject = Marshal.GetTypedObjectForIUnknown(pViewObject, typeof(SnapLibrary.UnsafeNativeMethods.IViewObject)) as SnapLibrary.UnsafeNativeMethods.IViewObject;

调用draw方法,绘制到图象上,以下是TakeSnapshot方法的完整代码:
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAPSnapshot类
通过IViewObject接口,取浏览器的图象,实现SNAPusing System;
通过IViewObject接口,取浏览器的图象,实现SNAPusing System.Collections.Generic;
通过IViewObject接口,取浏览器的图象,实现SNAPusing System.Text;
通过IViewObject接口,取浏览器的图象,实现SNAPusing System.Runtime.InteropServices;
通过IViewObject接口,取浏览器的图象,实现SNAPusing System.Runtime.InteropServices.ComTypes;
通过IViewObject接口,取浏览器的图象,实现SNAPusing System.Drawing;
通过IViewObject接口,取浏览器的图象,实现SNAPusing System.Windows.Forms;
通过IViewObject接口,取浏览器的图象,实现SNAP
通过IViewObject接口,取浏览器的图象,实现SNAPnamespace SnapLibrary
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP/**//// <summary>
通过IViewObject接口,取浏览器的图象,实现SNAP
/// ActiveX 组件快照类
通过IViewObject接口,取浏览器的图象,实现SNAP
/// AcitveX 必须实现 IViewObject 接口
通过IViewObject接口,取浏览器的图象,实现SNAP
///
通过IViewObject接口,取浏览器的图象,实现SNAP
/// 作者:随飞
通过IViewObject接口,取浏览器的图象,实现SNAP
/// http://chinasf.cnblogs.com
通过IViewObject接口,取浏览器的图象,实现SNAP
/// chinasf@hotmail.com
通过IViewObject接口,取浏览器的图象,实现SNAP
/// </summary>

通过IViewObject接口,取浏览器的图象,实现SNAPpublic class Snapshot
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP/**//// <summary>
通过IViewObject接口,取浏览器的图象,实现SNAP
/// 取快照
通过IViewObject接口,取浏览器的图象,实现SNAP
/// </summary>
通过IViewObject接口,取浏览器的图象,实现SNAP
/// <param name="pUnknown">Com 对象</param>
通过IViewObject接口,取浏览器的图象,实现SNAP
/// <param name="bmpRect">图象大小</param>
通过IViewObject接口,取浏览器的图象,实现SNAP
/// <returns></returns>

通过IViewObject接口,取浏览器的图象,实现SNAPpublic Bitmap TakeSnapshot(object pUnknown, Rectangle bmpRect)
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAPif (pUnknown == null)
通过IViewObject接口,取浏览器的图象,实现SNAPreturn null;
通过IViewObject接口,取浏览器的图象,实现SNAP//必须为com对象
通过IViewObject接口,取浏览器的图象,实现SNAP
if (!Marshal.IsComObject(pUnknown))
通过IViewObject接口,取浏览器的图象,实现SNAPreturn null;
通过IViewObject接口,取浏览器的图象,实现SNAP//IViewObject 接口
通过IViewObject接口,取浏览器的图象,实现SNAP
SnapLibrary.UnsafeNativeMethods.IViewObject ViewObject = null;
通过IViewObject接口,取浏览器的图象,实现SNAP IntPtr pViewObject = IntPtr.Zero;
通过IViewObject接口,取浏览器的图象,实现SNAP//内存图
通过IViewObject接口,取浏览器的图象,实现SNAP
Bitmap pPicture = new Bitmap(bmpRect.Width, bmpRect.Height);
通过IViewObject接口,取浏览器的图象,实现SNAP Graphics hDrawDC = Graphics.FromImage(pPicture);
通过IViewObject接口,取浏览器的图象,实现SNAP//获取接口
通过IViewObject接口,取浏览器的图象,实现SNAP
object hret = Marshal.QueryInterface(Marshal.GetIUnknownForObject(pUnknown),
通过IViewObject接口,取浏览器的图象,实现SNAPref UnsafeNativeMethods.IID_IViewObject, out pViewObject);
通过IViewObject接口,取浏览器的图象,实现SNAPtry
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP ViewObject = Marshal.GetTypedObjectForIUnknown(pViewObject, typeof(SnapLibrary.UnsafeNativeMethods.IViewObject)) as SnapLibrary.UnsafeNativeMethods.IViewObject;
通过IViewObject接口,取浏览器的图象,实现SNAP//调用Draw方法
通过IViewObject接口,取浏览器的图象,实现SNAP
ViewObject.Draw((int)DVASPECT.DVASPECT_CONTENT,
通过IViewObject接口,取浏览器的图象,实现SNAP -1,
通过IViewObject接口,取浏览器的图象,实现SNAP IntPtr.Zero,
通过IViewObject接口,取浏览器的图象,实现SNAPnull,
通过IViewObject接口,取浏览器的图象,实现SNAP IntPtr.Zero,
通过IViewObject接口,取浏览器的图象,实现SNAP hDrawDC.GetHdc(),
通过IViewObject接口,取浏览器的图象,实现SNAPnew NativeMethods.COMRECT(bmpRect),
通过IViewObject接口,取浏览器的图象,实现SNAPnull,
通过IViewObject接口,取浏览器的图象,实现SNAP IntPtr.Zero,
通过IViewObject接口,取浏览器的图象,实现SNAP 0);
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAPcatch (Exception ex)
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP Console.WriteLine(ex.Message);
通过IViewObject接口,取浏览器的图象,实现SNAPthrow ex;
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP//释放
通过IViewObject接口,取浏览器的图象,实现SNAP
hDrawDC.Dispose();
通过IViewObject接口,取浏览器的图象,实现SNAPreturn pPicture;
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP
通过IViewObject接口,取浏览器的图象,实现SNAP}

通过IViewObject接口,取浏览器的图象,实现SNAP

到此既完成了对Com对象的图象抓取.那么现在给它提供一个浏览器的实例,让它实现对 web page 的快照吧.
.net 2.0提供了webbrowser对象,它是对activex对象的包装,它的使用很简单,这里就不详细说明.
WebBrowser 对象的实例的属性ActiveXInstance就是它的原生COM对象,获取它的IVewObject接口,即可调用它实现的Draw方法把网页绘制到指定的DC上.

以下是对webbrowser对象的包装类,结合Snapshot 类的类代码:
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAPweb 页面快照类
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP/**//// <summary>
通过IViewObject接口,取浏览器的图象,实现SNAP
/// web 页面快照类
通过IViewObject接口,取浏览器的图象,实现SNAP
/// </summary>

通过IViewObject接口,取浏览器的图象,实现SNAPpublic class WebPageSnapshot : IDisposable
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAPstring url = "about:blank";
通过IViewObject接口,取浏览器的图象,实现SNAP
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP/**//// <summary>
通过IViewObject接口,取浏览器的图象,实现SNAP
/// 简单构造一个 WebBrowser 对象
通过IViewObject接口,取浏览器的图象,实现SNAP
/// 更灵活的应该是直接引用浏览器的com对象实现稳定控制
通过IViewObject接口,取浏览器的图象,实现SNAP
/// </summary>

通过IViewObject接口,取浏览器的图象,实现SNAP WebBrowser wb = new WebBrowser();
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP/**//// <summary>
通过IViewObject接口,取浏览器的图象,实现SNAP
/// URL 地址
通过IViewObject接口,取浏览器的图象,实现SNAP
/// http://www.cnblogs.com
通过IViewObject接口,取浏览器的图象,实现SNAP
/// </summary>

通过IViewObject接口,取浏览器的图象,实现SNAPpublic string Url
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAPget 通过IViewObject接口,取浏览器的图象,实现SNAP{ return url; }
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAPset 通过IViewObject接口,取浏览器的图象,实现SNAP{ url = value; }
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAPint width = 1024;
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP/**//// <summary>
通过IViewObject接口,取浏览器的图象,实现SNAP
/// 图象宽度
通过IViewObject接口,取浏览器的图象,实现SNAP
/// </summary>

通过IViewObject接口,取浏览器的图象,实现SNAPpublic int Width
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAPget 通过IViewObject接口,取浏览器的图象,实现SNAP{ return width; }
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAPset 通过IViewObject接口,取浏览器的图象,实现SNAP{ width = value; }
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAPint height = 768;
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP/**//// <summary>
通过IViewObject接口,取浏览器的图象,实现SNAP
/// 图象高度
通过IViewObject接口,取浏览器的图象,实现SNAP
/// </summary>

通过IViewObject接口,取浏览器的图象,实现SNAPpublic int Height
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAPget 通过IViewObject接口,取浏览器的图象,实现SNAP{ return height; }
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAPset 通过IViewObject接口,取浏览器的图象,实现SNAP{ height = value; }
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP/**//// <summary>
通过IViewObject接口,取浏览器的图象,实现SNAP
/// 初始化
通过IViewObject接口,取浏览器的图象,实现SNAP
/// </summary>

通过IViewObject接口,取浏览器的图象,实现SNAPprotected void InitComobject()
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAPtry
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP wb.ScriptErrorsSuppressed = false;
通过IViewObject接口,取浏览器的图象,实现SNAP wb.ScrollBarsEnabled = false;
通过IViewObject接口,取浏览器的图象,实现SNAP wb.Size = new Size(1024, 768);
通过IViewObject接口,取浏览器的图象,实现SNAP wb.Navigate(this.url);
通过IViewObject接口,取浏览器的图象,实现SNAP//因为没有窗体,所以必须如此
通过IViewObject接口,取浏览器的图象,实现SNAP
while (wb.ReadyState != WebBrowserReadyState.Complete)
通过IViewObject接口,取浏览器的图象,实现SNAP System.Windows.Forms.Application.DoEvents();
通过IViewObject接口,取浏览器的图象,实现SNAP wb.Stop();
通过IViewObject接口,取浏览器的图象,实现SNAPif (wb.ActiveXInstance == null)
通过IViewObject接口,取浏览器的图象,实现SNAPthrow new Exception("实例不能为空");
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAPcatch (Exception ex)
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP Console.WriteLine(ex.Message);
通过IViewObject接口,取浏览器的图象,实现SNAPthrow ex;
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP/**//// <summary>
通过IViewObject接口,取浏览器的图象,实现SNAP
/// 获取快照
通过IViewObject接口,取浏览器的图象,实现SNAP
/// </summary>
通过IViewObject接口,取浏览器的图象,实现SNAP
/// <returns>Bitmap</returns>

通过IViewObject接口,取浏览器的图象,实现SNAPpublic Bitmap TakeSnapshot()
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAPtry
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP InitComobject();
通过IViewObject接口,取浏览器的图象,实现SNAP//构造snapshot类,抓取浏览器ActiveX的图象
通过IViewObject接口,取浏览器的图象,实现SNAP
SnapLibrary.Snapshot snap = new SnapLibrary.Snapshot();
通过IViewObject接口,取浏览器的图象,实现SNAPreturn snap.TakeSnapshot(wb.ActiveXInstance, new Rectangle(0, 0, this.width, this.height));
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAPcatch (Exception ex)
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP Console.WriteLine(ex.Message);
通过IViewObject接口,取浏览器的图象,实现SNAPthrow ex;
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP
通过IViewObject接口,取浏览器的图象,实现SNAPpublic void Dispose()
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP wb.Dispose();
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP
通过IViewObject接口,取浏览器的图象,实现SNAP }

这里提供一个测试用的代码:
通过IViewObject接口,取浏览器的图象,实现SNAPclass Program
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP/**//// <summary>
通过IViewObject接口,取浏览器的图象,实现SNAP
/// 测试
通过IViewObject接口,取浏览器的图象,实现SNAP
/// </summary>
通过IViewObject接口,取浏览器的图象,实现SNAP
/// <param name="args"></param>

通过IViewObject接口,取浏览器的图象,实现SNAP [STAThread]
通过IViewObject接口,取浏览器的图象,实现SNAPstatic void Main(string[] args)
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP//web 页面快照
通过IViewObject接口,取浏览器的图象,实现SNAP
WebPageSnapshot wps = new WebPageSnapshot();
通过IViewObject接口,取浏览器的图象,实现SNAP
通过IViewObject接口,取浏览器的图象,实现SNAPif (args != null && args.Length > 1)
通过IViewObject接口,取浏览器的图象,实现SNAP wps.Url = args[0];
通过IViewObject接口,取浏览器的图象,实现SNAPelse
通过IViewObject接口,取浏览器的图象,实现SNAP wps.Url = "http://www.cnblogs.com";
通过IViewObject接口,取浏览器的图象,实现SNAP
通过IViewObject接口,取浏览器的图象,实现SNAPtry
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP//保存到文件
通过IViewObject接口,取浏览器的图象,实现SNAP
wps.TakeSnapshot().Save("1.bmp");
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAPcatch (Exception ex)
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP Console.WriteLine(ex.Message);
通过IViewObject接口,取浏览器的图象,实现SNAP Console.ReadLine();
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP wps.Dispose();
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAP
通过IViewObject接口,取浏览器的图象,实现SNAP
通过IViewObject接口,取浏览器的图象,实现SNAP }

工程原始代码下载:
/Files/Chinasf/SnapLibrary.rar

当然,这样做可能太复杂了,因为.net 为我们简化了所有的工作,简单到任意的contrl对象都支持DrawToBitmap 方法.不过想要了解机制的朋友们,可以研究一下.

2006年12月26日 8:55:14 修正:请到Snapshot类中增加一句释放引用接口的代码.
Snapshot..
通过IViewObject接口,取浏览器的图象,实现SNAPtry
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP//ViewObject = Marshal.GetObjectForIUnknown(pViewObject) as SnapLibrary.UnsafeNativeMethods.IViewObject;
通过IViewObject接口,取浏览器的图象,实现SNAP
ViewObject = Marshal.GetTypedObjectForIUnknown(pViewObject, typeof(SnapLibrary.UnsafeNativeMethods.IViewObject)) as SnapLibrary.UnsafeNativeMethods.IViewObject;
通过IViewObject接口,取浏览器的图象,实现SNAP//调用Draw方法
通过IViewObject接口,取浏览器的图象,实现SNAP
ViewObject.Draw((int)DVASPECT.DVASPECT_CONTENT,
通过IViewObject接口,取浏览器的图象,实现SNAP -1,
通过IViewObject接口,取浏览器的图象,实现SNAP IntPtr.Zero,
通过IViewObject接口,取浏览器的图象,实现SNAPnull,
通过IViewObject接口,取浏览器的图象,实现SNAP IntPtr.Zero,
通过IViewObject接口,取浏览器的图象,实现SNAP hDrawDC.GetHdc(),
通过IViewObject接口,取浏览器的图象,实现SNAPnew NativeMethods.COMRECT(bmpRect),
通过IViewObject接口,取浏览器的图象,实现SNAPnull,
通过IViewObject接口,取浏览器的图象,实现SNAP IntPtr.Zero,
通过IViewObject接口,取浏览器的图象,实现SNAP 0);
通过IViewObject接口,取浏览器的图象,实现SNAPMarshal.Release(pViewObject);
通过IViewObject接口,取浏览器的图象,实现SNAP }

通过IViewObject接口,取浏览器的图象,实现SNAPcatch (Exception ex)
通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP通过IViewObject接口,取浏览器的图象,实现SNAP{
通过IViewObject接口,取浏览器的图象,实现SNAP Console.WriteLine(ex.Message);
通过IViewObject接口,取浏览器的图象,实现SNAPthrow ex;
通过IViewObject接口,取浏览器的图象,实现SNAP }

红色加粗位置.



本文转自suifei博客园博客,原文链接:http://www.cnblogs.com/Chinasf/archive/2006/12/25/603294.html,如需转载请自行联系原作者
上一篇:Spring Cloud Spring Boot mybatis分布式微服务云架构(七)开发Web应用(1)


下一篇:8月14日Spark社区直播【Spark Shuffle 优化】