How do you take a Screenshot of a website via .Net code?

0 votes
asked Mar 17, 2009 by andrew-harry

Is it possible to take a screen shot of any given url using .Net code?

What is the easiest way to do it?

4 Answers

0 votes
answered Jan 17, 2009 by john-feminella

I'd suggest using a third-party approach for this, not doing it yourself. If you insist, though, then the heavy-handed way is to use System.Diagnostics.Process to launch a browser, then GetDesktopImage to get a screenshot.

I'm sure there's an easier way, but that looks like this:

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

public class PlatformInvokeGDI32
    public  const int SRCCOPY = 13369376;

    public static extern IntPtr DeleteDC(IntPtr hDc);

    public static extern IntPtr DeleteObject(IntPtr hDc);

    public static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, int RasterOp);

    [DllImport ("gdi32.dll",EntryPoint="CreateCompatibleBitmap")]
    public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc,int nWidth, int nHeight);

    [DllImport ("gdi32.dll",EntryPoint="CreateCompatibleDC")]
    public static extern IntPtr CreateCompatibleDC(IntPtr hdc);

    [DllImport ("gdi32.dll",EntryPoint="SelectObject")]
    public static extern IntPtr SelectObject(IntPtr hdc,IntPtr bmp);

public class PlatformInvokeUSER32
    public const int SM_CXSCREEN = 0;
    public const int SM_CYSCREEN = 1;

    [DllImport("user32.dll", EntryPoint="GetDesktopWindow")]
    public static extern IntPtr GetDesktopWindow();

    public static extern IntPtr GetDC(IntPtr ptr);

    public static extern int GetSystemMetrics(int abc);

    public static extern IntPtr GetWindowDC(Int32 ptr);

    public static extern IntPtr ReleaseDC(IntPtr hWnd,IntPtr hDc);

public class CaptureScreen
    public static Bitmap GetDesktopImage()
        //In size variable we shall keep the size of the screen.
        SIZE size;

        //Variable to keep the handle to bitmap.
        IntPtr hBitmap;

        //Here we get the handle to the desktop device context.
        IntPtr  hDC = PlatformInvokeUSER32.GetDC(PlatformInvokeUSER32.GetDesktopWindow());

        //Here we make a compatible device context in memory for screen device context.
        IntPtr hMemDC = PlatformInvokeGDI32.CreateCompatibleDC(hDC);

        //We pass SM_CXSCREEN constant to GetSystemMetrics to get the
        //X coordinates of the screen. = PlatformInvokeUSER32.GetSystemMetrics(PlatformInvokeUSER32.SM_CXSCREEN);

        //We pass SM_CYSCREEN constant to GetSystemMetrics to get the Y coordinates of the screen. = PlatformInvokeUSER32.GetSystemMetrics (PlatformInvokeUSER32.SM_CYSCREEN);

        //We create a compatible bitmap of the screen size and using the screen device context.
        hBitmap = PlatformInvokeGDI32.CreateCompatibleBitmap(hDC,,;

        //As hBitmap is IntPtr, we cannot check it against null.
        //For this purpose, IntPtr.Zero is used.
        if(hBitmap != IntPtr.Zero)
            //Here we select the compatible bitmap in the memeory device
            //context and keep the refrence to the old bitmap.
            IntPtr hOld = (IntPtr) PlatformInvokeGDI32.SelectObject(hMemDC, hBitmap);

            //We copy the Bitmap to the memory device context.
            PlatformInvokeGDI32.BitBlt(hMemDC, 0, 0,,, hDC, 0, 0, PlatformInvokeGDI32.SRCCOPY);

            //We select the old bitmap back to the memory device context.
            PlatformInvokeGDI32.SelectObject(hMemDC, hOld);

            //We delete the memory device context.

            //We release the screen device context.
            PlatformInvokeUSER32.ReleaseDC(PlatformInvokeUSER32.GetDesktopWindow(), hDC);

            //Image is created by Image bitmap handle and stored in local variable.
            Bitmap bmp = System.Drawing.Image.FromHbitmap(hBitmap);

            //Release the memory to avoid memory leaks.

            //This statement runs the garbage collector manually.

            //Return the bitmap
            return bmp;

        //If hBitmap is null, retun null.
        return null;

//This structure shall be used to keep the size of the screen.
public struct SIZE
  public int cx;
  public int cy;
0 votes
answered Mar 17, 2009 by assaf-lavie

There are several 3rd party components that does this. Apparently it's not trivial, since things like Flash and stuff don't capture so easily, for example.

I've used HTMLSnapshot in the past and was pleased with it (it's not free, but pretty cheap).

I heartily suggest you don't waste too much time implementing this yourself because you're bound to end up redoing a lot of end-cases that these 3rd party solutions already handle.

0 votes
answered Mar 17, 2009 by svish

Just stumbled over this:

Maybe something you could use?

0 votes
answered Jan 28, 2012 by kroolk

I searched far and wide to find a solution to this problem and the issue with using the WebBrowser and other suggestions is that you need a lot of access to the box.

To date this is the best third party tool I have been able to find:

Their SEO is terrible, but I believe I found them on a forum or even Stack... I do own a license and what you get is just a single DLL you can reference. Passing a license to the constructor removes their watermark.

After a quick peek with ILSpy I believe what it does is that it interprets the HTML and dumps an image for your viewing pleasure.


Saving A URL

WebsitesScreenshot.WebsitesScreenshot  _Obj;
_Obj = new WebsitesScreenshot.WebsitesScreenshot ();
WebsitesScreenshot.WebsitesScreenshot.Result _Result;
_Result = _Obj.CaptureWebpage("");
if (_Result == WebsitesScreenshot.WebsitesScreenshot.Result.Captured)
    _Obj.ImageFormat = WebsitesScreenshot.
    _Obj.SaveImage ("c:\\google.png");

Saving Raw HTML String

WebsitesScreenshot.WebsitesScreenshot _Obj;
_Obj=new WebsitesScreenshot.WebsitesScreenshot();
WebsitesScreenshot.WebsitesScreenshot.Result _Result;
_Result = _Obj.CaptureHTML(
"<html><body><h1> Hello world </h1></body></html>");
if (_Result == WebsitesScreenshot.WebsitesScreenshot.Result.Captured)
    _Obj.ImageFormat = WebsitesScreenshot.

You can find more on their usage page. Found Here:

Hope this helps !


Welcome to Q&A, where you can ask questions and receive answers from other members of the community.
Website Online Counter