.
GDI+ FAQ
Skip Navigation LinksWelcome : GDI+ FAQ : How to capture the screen or an image of a control
Thanks to Pascal Cloup and John Hornick for discovering a memory leak in this code.

Capturing the screen or the surface of a control

This simple process requires a little bit of interop to provide access to the GDI BitBlt API.

First, you need to import the BitBlt, GetDC and ReleaseDC functions.

    //imports the GDI BitBlt function that enables the background of the window

    //to be captured

    [DllImport("gdi32.dll")]

    private static extern bool BitBlt(

      IntPtr hdcDest, // handle to destination DC

      int nXDest, // x-coord of destination upper-left corner

      int nYDest, // y-coord of destination upper-left corner

      int nWidth, // width of destination rectangle

      int nHeight, // height of destination rectangle

      IntPtr hdcSrc, // handle to source DC

      int nXSrc, // x-coordinate of source upper-left corner

      int nYSrc, // y-coordinate of source upper-left corner

      System.Int32 dwRop // raster operation code

      );

 

    [DllImport("User32.dll")]

    public extern static System.IntPtr GetDC(System.IntPtr hWnd);

    [DllImport("User32.dll")]

    public extern static int ReleaseDC(System.IntPtr hWnd, System.IntPtr hDC); //modified to include hWnd

Now, to capture the screen in it's entirety you can do the following.

      System.IntPtr desktopDC=GetDC(System.IntPtr.Zero);

      Bitmap bm=new Bitmap(SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height);

      Graphics g=Graphics.FromImage(bm);

      System.IntPtr bmDC=g.GetHdc();

 

      BitBlt(bmDC,0,0,bm.Width,bm.Height,desktopDC,0,0,0x00CC0020 /*SRCCOPY*/);

 

      ReleaseDC(System.IntPtr.Zero, desktopDC);

      g.ReleaseHdc(bmDC);

      g.Dispose();

The Bitmap object BM now contains a screen shot of the entire desktop.

To capture an individual control, for example the surface of a PictureBox you can do the following.

      System.IntPtr srcDC=GetDC(this.pictureBox1.Handle);

      Bitmap bm=new Bitmap(this.pictureBox1.Width,this.pictureBox1.Height);

      Graphics g=Graphics.FromImage(bm);

      System.IntPtr bmDC=g.GetHdc();

 

      BitBlt(bmDC,0,0,bm.Width,bm.Height,srcDC,0,0,0x00CC0020 /*SRCCOPY*/);

 

      ReleaseDC(this.pictureBox1.Handle, srcDC);

      g.ReleaseHdc(bmDC);

      g.Dispose();

Back to the GDI+ FAQ.

Copyright Robert W. Powell 2003. All rights reserved.

 

Sponsored By
DaraizeTechnologies.com
Bob Powell

Create your badge

Copyright © Bob Powell 2000-2012.  All rights reserved.