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.
|