首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

!用webbrowser控件对网页截图是空白的~解决方案

2014-01-17 
!!用webbrowser控件对网页截图是空白的~急!!这两天要对一个网页进行后台截图,相当于网页快照,后台保存图片

!!用webbrowser控件对网页截图是空白的~急!!
这两天要对一个网页进行后台截图,相当于网页快照,后台保存图片即可。
目前想到的方法是添加一个webbrowser控件,然后对控件抓图进行保存。
新建的wpf工程默认界面是mainwindow,这个上边用toolbox添加的webbrowser是从windows.control中继承来的,没有documentcompletted事件(想通过这个事件判断网页是否加载完毕);
所以新建了一个form1类,在form界面上用toolbox添加了webbrowser控件,这次是从weindows.form中继承来的。有上述事件。

用了以下两种类似的方法截图,不知道为什么截图保存的图片都是空白的,没有网页内容,请教!

1 通过以下函数进行截图(这个貌似只能在mainwindow里用,form1里不知道对其第一个参数设什么)
private void SaveToImage(FrameworkElement p_FrameworkElement, string p_FileName)
        {
            System.IO.FileStream fs = new System.IO.FileStream(p_FileName, System.IO.FileMode.Create);
            RenderTargetBitmap bmp = new RenderTargetBitmap((int)p_FrameworkElement.ActualWidth, (int)p_FrameworkElement.ActualHeight, 96.0, 96.0, PixelFormats.Pbgra32);
            bmp.Render(p_FrameworkElement);
            BitmapEncoder encoder = new PngBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(bmp));
            encoder.Save(fs);
            fs.Close();
            fs.Dispose();

2 还尝试了在form1代码中用如下代码截图:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            System.Drawing.Size mySize = webBrowser1.Document.Window.Size;
            Bitmap myPic = new Bitmap(mySize.Width, mySize.Height);
            Rectangle myRec = new Rectangle(0, 0, mySize.Width, mySize.Height);
            webBrowser1.Size = mySize;
            webBrowser1.DrawToBitmap(myPic, myRec);
            myPic.Save("E:\\aaaaaa.jpg");
            System.Windows.Forms.MessageBox.Show("Ok");
        }
新手,分不多,请大家多多帮忙
如果有不用webbrowser控件就可以后台截图的方法,也请告诉我,谢谢
[解决办法]
使用

Bitmap MyImage = Test.GetControlScrollImage(new Uri(@"http://www.sina.com.cn"), 1024); 
MyImage.Save(@"C:/1.BMP"); 
MyImage.Dispose();
使用到的类


using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 

using System.Drawing.Imaging; 
using System.Runtime.InteropServices; 
using System.Security; 

namespace Print 

    public class Test 
    { 
        public static Bitmap GetHtmlImage(Uri UrlString,int Width) 
        { 
            WebBrowser MyControl = new WebBrowser(); 
            MyControl.Size = new Size(Width, 10); 
            MyControl.Url = UrlString; 
            while (MyControl.ReadyState != WebBrowserReadyState.Complete) 
            { 
                Application.DoEvents(); 
            } 
            
           
            MyControl.Height= MyControl.Document.Body.ScrollRectangle.Height+20; 


            MyControl.Url = UrlString; 
            WebControlImage.Snapshot snap = new WebControlImage.Snapshot(); 
            Bitmap MyImage= snap.TakeSnapshot(MyControl.ActiveXInstance, new Rectangle(0, 0, MyControl.Width, MyControl.Height)); 

            MyControl.Dispose(); 

            return MyImage; 
             
        }       
        /// <summary> 
        /// WebBrowser获取图形 
        /// </summary> 
        private class WebControlImage 
        { 
            internal static class NativeMethods 
            { 
                [StructLayout(LayoutKind.Sequential)] 
                public sealed class tagDVTARGETDEVICE 
                { 
                    [MarshalAs(UnmanagedType.U4)] 
                    public int tdSize; 
                    [MarshalAs(UnmanagedType.U2)] 
                    public short tdDriverNameOffset; 
                    [MarshalAs(UnmanagedType.U2)] 
                    public short tdDeviceNameOffset; 
                    [MarshalAs(UnmanagedType.U2)] 
                    public short tdPortNameOffset; 
                    [MarshalAs(UnmanagedType.U2)] 
                    public short tdExtDevmodeOffset; 
                } 

                [StructLayout(LayoutKind.Sequential)] 
                public class COMRECT 
                { 
                    public int left; 
                    public int top; 
                    public int right; 
                    public int bottom; 
                    public COMRECT() 
                    { 
                    } 

                    public COMRECT(Rectangle r) 
                    { 
                        this.left = r.X; 
                        this.top = r.Y; 
                        this.right = r.Right; 
                        this.bottom = r.Bottom; 


                    } 

                    public COMRECT(int left, int top, int right, int bottom) 
                    { 
                        this.left = left; 
                        this.top = top; 
                        this.right = right; 
                        this.bottom = bottom; 
                    } 

                    public static NativeMethods.COMRECT FromXYWH(int x, int y, int width, int height) 
                    { 
                        return new NativeMethods.COMRECT(x, y, x + width, y + height); 
                    } 

                    public override string ToString() 
                    { 
                        return string.Concat(new object[] { "Left = ", this.left, " Top ", this.top, " Right = ", this.right, " Bottom = ", this.bottom }); 
                    } 

                } 

                [StructLayout(LayoutKind.Sequential)] 
                public sealed class tagLOGPALETTE 
                { 
                    [MarshalAs(UnmanagedType.U2)] 
                    public short palVersion; 
                    [MarshalAs(UnmanagedType.U2)] 
                    public short palNumEntries; 
                } 
            } 


            public class Snapshot 
            { 
                /// <summary> 
                /// 取快照 
                /// </summary> 
                /// <param name="pUnknown">Com 对象</param> 
                /// <param name="bmpRect">图象大小</param> 
                /// <returns></returns> 
                public Bitmap TakeSnapshot(object pUnknown, Rectangle bmpRect) 
                { 
                    if (pUnknown == null) 
                        return null; 


                    //必须为com对象 
                    if (!Marshal.IsComObject(pUnknown)) 
                        return null; 
                    //IViewObject 接口 
                    UnsafeNativeMethods.IViewObject ViewObject = null; 
                    IntPtr pViewObject = IntPtr.Zero; 
                    //内存图 
                    Bitmap pPicture = new Bitmap(bmpRect.Width, bmpRect.Height); 
                    Graphics hDrawDC = Graphics.FromImage(pPicture); 
                    //获取接口 
                    object hret = Marshal.QueryInterface(Marshal.GetIUnknownForObject(pUnknown), 
                        ref UnsafeNativeMethods.IID_IViewObject, out pViewObject); 
                    try 
                    { 
                        ViewObject = Marshal.GetTypedObjectForIUnknown(pViewObject, typeof(UnsafeNativeMethods.IViewObject)) as UnsafeNativeMethods.IViewObject; 
                        //调用Draw方法 
                        ViewObject.Draw((int)System.Runtime.InteropServices.ComTypes.DVASPECT.DVASPECT_CONTENT, 
                            -1, 
                            IntPtr.Zero, 
                            null, 
                            IntPtr.Zero, 
                            hDrawDC.GetHdc(), 
                            new NativeMethods.COMRECT(bmpRect), 
                            null, 
                            IntPtr.Zero, 
                            0); 
                    } 
                    catch (Exception ex) 
                    { 
                        Console.WriteLine(ex.Message); 
                        throw ex; 
                    } 
                    //释放 
                    hDrawDC.Dispose(); 
                    return pPicture; 


                } 
            } 
            [SuppressUnmanagedCodeSecurity] 
            internal static class UnsafeNativeMethods 
            { 
                public static Guid IID_IViewObject = new Guid("{0000010d-0000-0000-C000-000000000046}"); 

                [ComImport, Guid("0000010d-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
                public interface IViewObject 
                { 
                    [PreserveSig] 
                    int 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); 
                    [PreserveSig] 
                    int GetColorSet([In, MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, [In] NativeMethods.tagDVTARGETDEVICE ptd, IntPtr hicTargetDev, [Out] NativeMethods.tagLOGPALETTE ppColorSet); 
                    [PreserveSig] 
                    int Freeze([In, MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, [Out] IntPtr pdwFreeze); 
                    [PreserveSig] 
                    int Unfreeze([In, MarshalAs(UnmanagedType.U4)] int dwFreeze); 
                    void SetAdvise([In, MarshalAs(UnmanagedType.U4)] int aspects, [In, MarshalAs(UnmanagedType.U4)] int advf, [In, MarshalAs(UnmanagedType.Interface)] System.Runtime.InteropServices.ComTypes.IAdviseSink pAdvSink); 
                    void GetAdvise([In, Out, MarshalAs(UnmanagedType.LPArray)] int[] paspects, [In, Out, MarshalAs(UnmanagedType.LPArray)] int[] advf, [In, Out, MarshalAs(UnmanagedType.LPArray)] System.Runtime.InteropServices.ComTypes.IAdviseSink[] pAdvSink); 
                } 
            } 
        } 

    } 
}



热点排行