Googler

两情相悦,又岂在朝朝暮暮。

Browser GetImage

using Microsoft.Win32;
using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Console_21697048
{
    /// <summary>
    /// http://stackoverflow.com/q/21697048/1768303
    /// </summary>
   internal class Program2
    {
        //const string HTML = "<!DOCTYPE html><body style='background-color: grey'><div style='background-color: blue; opacity: 0.2; color: yellow'>This is a text</div></body>";
        const string FILE_NAME = @"d:\webpage.png";
        //readonly static Size IMAGE_SIZE = new Size(320, 200);

        // Main
        public static void Main2(string[] args)
        {
            try
            {
                // enable HTML5 etc (assuming we're running IE9+)
                SetFeatureBrowserFeature("FEATURE_BROWSER_EMULATION", 9000);
                // force software rendering
                SetFeatureBrowserFeature("FEATURE_IVIEWOBJECTDRAW_DMLT9_WITH_GDI", 1);
                SetFeatureBrowserFeature("FEATURE_GPU_RENDERING", 0);

                using (var apartment = new AnfleCrawler.Common.MessageLoopApartment())
                {
                    // create WebBrowser on a seprate thread with its own message loop
                    var webBrowser = apartment.Invoke(() => new WebBrowser());

                    // navigate and wait for the result 
                    apartment.Invoke(() =>
                    {
                        var pageLoadedTcs = new TaskCompletionSource<bool>();
                        webBrowser.DocumentCompleted += (s, e) =>
                            pageLoadedTcs.TrySetResult(true);

                        //webBrowser.DocumentText = HTML;
                        webBrowser.Navigate(AnfleCrawler.UITest.IEForm.ConstUris.Taobao);
                        return pageLoadedTcs.Task;
                    }).Wait();
                    // save the picture
                    apartment.Invoke(() =>
                    {
                        webBrowser.Size = webBrowser.Document.Body.ScrollRectangle.Size;
                        webBrowser.Document.InvokeScript("eval", new object[]{@"    window.addEventListener('load', function () {
        alert('test!');
        window.focus();
        window.scrollTo(0, document.documentElement.offsetHeight);
    });"});
                        var rectangle = new Rectangle(0, 0, webBrowser.Width, webBrowser.Height);
                        System.Threading.Thread.Sleep(20000);
                        // get reference DC
                        using (var screenGraphics = webBrowser.CreateGraphics())
                        {
                            var screenHdc = screenGraphics.GetHdc();
                            // create a metafile
                            using (var metafile = new Metafile(screenHdc, rectangle, MetafileFrameUnit.Pixel))
                            {
                                using (var graphics = Graphics.FromImage(metafile))
                                {
                                    var hdc = graphics.GetHdc();
                                    //var rect = new Rectangle(0, 0, 320, 50);
                                    OleDraw(webBrowser.ActiveXInstance, DVASPECT_CONTENT, hdc, ref rectangle);
                                    graphics.ReleaseHdc(hdc);
                                }
                                // save the metafile as bitmap
                                metafile.Save(FILE_NAME, ImageFormat.Png);
                            }
                            screenGraphics.ReleaseHdc(screenHdc);
                        }
                    });

                    // dispose of webBrowser
                    apartment.Invoke(() => webBrowser.Dispose());
                    webBrowser = null;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

        // interop
        const uint DVASPECT_CONTENT = 1;

        [DllImport("ole32.dll", PreserveSig = false)]
        static extern void OleDraw(
            [MarshalAs(UnmanagedType.IUnknown)] object pUnk,
            uint dwAspect,
            IntPtr hdcDraw,
            [In] ref System.Drawing.Rectangle lprcBounds);

        // WebBrowser Feature Control
        // http://msdn.microsoft.com/en-us/library/ie/ee330733(v=vs.85).aspx
        static void SetFeatureBrowserFeature(string feature, uint value)
        {
            if (LicenseManager.UsageMode != LicenseUsageMode.Runtime)
                return;
            var appName = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
            Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\" + feature,
                appName, value, RegistryValueKind.DWord);
        }

        public static void GetImage(WebBrowser webBrowser)
        {
            var rectangle = new Rectangle(0, 0, webBrowser.Width, webBrowser.Height);
            //System.Threading.Thread.Sleep(20000);
            // get reference DC
            using (var screenGraphics = webBrowser.CreateGraphics())
            {
                var screenHdc = screenGraphics.GetHdc();
                // create a metafile
                using (var metafile = new Metafile(screenHdc, rectangle, MetafileFrameUnit.Pixel))
                {
                    using (var graphics = Graphics.FromImage(metafile))
                    {
                        var hdc = graphics.GetHdc();
                        //var rect = new Rectangle(0, 0, 320, 50);
                        OleDraw(webBrowser.ActiveXInstance, DVASPECT_CONTENT, hdc, ref rectangle);
                        graphics.ReleaseHdc(hdc);
                    }
                    // save the metafile as bitmap
                    metafile.Save(FILE_NAME, ImageFormat.Png);
                }
                screenGraphics.ReleaseHdc(screenHdc);
            }
        }
    }
}

 

posted on 2014-11-12 11:14  RockyLOMO  阅读(366)  评论(0编辑  收藏  举报

导航

Apple/苹果笔记本 Mac Air MC968CH/A 行货在保 I5 11寸 超级本