The following example source code shows how to capture the screen and save it to an image. Hope you find it useful.
/* Author: Perry Lee
* Submission: Capture Screen (Add Screenshot Capability to Programs)
* Date of Submission: 12/29/03
*/
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
// If you have any questions regarding functions (methods) imported from
// GDI32.dll and User32.dll refer to 'msdn.microsoft.com'
class GDI32
{
[DllImport("GDI32.dll")]
public static extern bool BitBlt(int hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,int hdcSrc,int nXSrc,int nYSrc,int dwRop);
[DllImport("GDI32.dll")]
public static extern int CreateCompatibleBitmap(int hdc,int nWidth, int nHeight);[DllImport("GDI32.dll")]
public static extern int CreateCompatibleDC(int hdc);
[DllImport("GDI32.dll")]
public static extern bool DeleteDC(int hdc);
[DllImport("GDI32.dll")]
public static extern bool DeleteObject(int hObject);
[DllImport("GDI32.dll")]
public static extern int GetDeviceCaps(int hdc,int nIndex);
[DllImport("GDI32.dll")]
public static extern int SelectObject(int hdc,int hgdiobj);
class User32
{
[DllImport("User32.dll")]
public static extern int GetDesktopWindow();
[DllImport("User32.dll")]
public static extern int GetWindowDC(int hWnd);
[DllImport("User32.dll")]
public static extern int ReleaseDC(int hWnd,int hDC);
}
class Example
{
public void CaptureScreen(string fileName,ImageFormat imageFormat)
{
int hdcSrc = User32.GetWindowDC(User32.GetDesktopWindow()),
hdcDest = GDI32.CreateCompatibleDC(hdcSrc),
hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc,
GDI32.GetDeviceCaps(hdcSrc,8),GDI32.GetDeviceCaps(hdcSrc,10)); GDI32.SelectObject(hdcDest,hBitmap);
GDI32.BitBlt(hdcDest,0,0,GDI32.GetDeviceCaps(hdcSrc,8),
GDI32.GetDeviceCaps(hdcSrc,10),hdcSrc,0,0,0x00CC0020);
SaveImageAs(hBitmap,fileName,imageFormat);
Cleanup(hBitmap,hdcSrc,hdcDest);
}
private void Cleanup(int hBitmap,int hdcSrc,int hdcDest)
{
User32.ReleaseDC(User32.GetDesktopWindow(),hdcSrc);
GDI32.DeleteDC(hdcDest);
GDI32.DeleteObject(hBitmap);
}
private void SaveImageAs(int hBitmap,string fileName,ImageFormat imageFormat)
{
Bitmap image =
new Bitmap(Image.FromHbitmap(new IntPtr(hBitmap)),
Image.FromHbitmap(new IntPtr(hBitmap)).Width,
Image.FromHbitmap(new IntPtr(hBitmap)).Height);
image.Save(fileName,imageFormat);
}
} Explanation of methods:
public
void CaptureScreen(string fileName,ImageFormat imageFormat){
int hdcSrc = User32.GetWindowDC(User32.GetDesktopWindow()), // Get a handle to the desktop window
hdcDest = GDI32.CreateCompatibleDC(hdcSrc), // Create a memory device context
hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, // Create a bitmap and place it in the memory DC
GDI32.GetDeviceCaps(hdcSrc,8),GDI32.GetDeviceCaps(hdcSrc,10));
// GDI32.GetDeviceCaps(hdcSrc,8) returns the width of the desktop window
// GDI32.GetDeviceCaps(hdcSrc,10) returns the height of the desktop window
GDI32.SelectObject(hdcDest,hBitmap); // Required to create a color bitmap
GDI32.BitBlt(hdcDest,0,0,GDI32.GetDeviceCaps(hdcSrc,8), // Copy the on-screen image into the memory DC
GDI32.GetDeviceCaps(hdcSrc,10),hdcSrc,0,0,0x00CC0020);
SaveImageAs(hBitmap,fileName,imageFormat); // Save the screen-capture to the specified file using the designated image format
Cleanup(hBitmap,hdcSrc,hdcDest); // Free system resources
}
private void Cleanup(int hBitmap,int hdcSrc,int hdcDest)
{
// Release the device context resources back to the system
User32.ReleaseDC(User32.GetDesktopWindow(),hdcSrc);
GDI32.DeleteDC(hdcDest);
GDI32.DeleteObject(hBitmap);
}
private void SaveImageAs(int hBitmap,string fileName,ImageFormat imageFormat)
{
// Create a bitmap from the Windows handle
Bitmap image = new Bitmap(Image.FromHbitmap(new IntPtr(hBitmap)),
Image.FromHbitmap(new IntPtr(hBitmap)).Width,
Image.FromHbitmap(new IntPtr(hBitmap)).Height);
image.Save(fileName,imageFormat);
}
Vikram SinghPosted May 21, 2014, 7:52 AM
When i execute the above code for screen capture then it is working fine locally,but when upload on server the capture screen image is black screen,please give me a solution as soon as possible.
Vikram SinghPosted May 20, 2014, 5:59 AM
Please send me the source code download link for screen capture to my mail id : [email protected]
Arup DoluiPosted Aug 8, 2012, 3:42 PM
hii, this code is not working. plz mail me the full source code at [email protected] plz help me out.. thank you..
sushil sainiPosted Apr 10, 2011, 5:48 AM
I creata an exe file using this code where i execute this code using WMI or Psexec it create the Black Screen. what the problem can any one have solution pls make response as early as possible thank in advance
Ajay VadgamaPosted Apr 4, 2011, 2:01 AM
Please send me the source code download link to my mail id : [email protected]
Jorge HoracioPosted Sep 10, 2010, 2:15 AM
Hi, I need to create an application in C# that captures part of the screen when certain part of the same screen changes. Thank you all.
JoAnna KellyPosted Aug 14, 2009, 12:04 PM
Hi, I implemented the code successfully on a page in my web app but I dont want the whole desktop in screen shot. I just want browser/app window (ALT+PrintScreen) Is there a way to access window/Screen Handle props for ASPX page like you can for Windows.Forms? ANY HELP IS APPRECIATED! This has been quite frustrating! THANKS SO MUCH! Jo
akilaPosted Oct 6, 2008, 9:58 PM
I converted this code and tried to do this in VB.net .But I getting only the balck background I am not getting any image.Is there any suggestion for this. Thanks
EnnioPosted Feb 13, 2006, 4:22 AM
Hy Perry, the simple question is this: I would try to capture a webPage using the mshtml namespace. There's any mode to retrieve the handle of the mshtml.HTMLWindow2 that i can use to navigate to a site in the background. And if we can retrieve the window handle the CreateCompatibleBitmap function can create a bitmap of the browser window? Thanks i.a. for Your support. Ennio