Capturing the Screen Image Using C#


<!– Sample image – gif or jpg –>

CapturesScreen Capturing the Screen Image Using C# <!– For which environment is this code specific??? –>

Environment: C#,.NetFramewok, Windows9x,Windows2000, WindowsXP

<!– The ‘p’ starts a paragraph of normal text –> I am working on adesktop sharing type application in C#. First problem that Iencountered was that there was not much in C# to capture the desktopimage. After a bit research I came to know that I shall have to use theWin32 APIs to provide this functionality to my application.I made following three classes to perform this job.

PlatformInvokeGDI32: All the GDI32.dll APIs being used in this application are placed in this class.

PlatformInvokeUSER32: All th User32.dll APIs have been placed in this class.

CaptureScreen: In this class I have provided a simple staticfunction GetDesktoImage that captures the screen image using the apisgiven in PlatformInvokeGDI32 and PlatformInvokeUSER32 and returns it asa bitmap.

You can very easily place these classes inyour C# application. Just copy and paste following code in your C#project without changing any thing at all. If you want to useaccompanying source files, either you add the CaptureScreen namespacein your project or just change the CaptureScreen namespace in theseclasses with your project namespace and thats all.

Here is the Cool Source Code

/// <summary>
/// This class shall keep the GDI32 APIs used in our program.
/// </summary>
public class PlatformInvokeGDI32
{

#region Class Variables
public const int SRCCOPY = 13369376;
#endregion

#region Class Functions

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

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

[DllImport("gdi32.dll",EntryPoint="BitBlt")]
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);
#endregion

}

/// <summary>
/// This class shall keep the User32 APIs used in our program.
/// </summary>
public class PlatformInvokeUSER32
{
#region Class Variables
public const int SM_CXSCREEN=0;
public const int SM_CYSCREEN=1;
#endregion

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

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

[DllImport("user32.dll",EntryPoint="GetSystemMetrics")]
public static extern int GetSystemMetrics(int abc);

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

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

#endregion
}

/// <summary>
/// This class shall keep all the functionality for capturing the desktop.
/// </summary>
public class CaptureScreen
{

#region Public Class Functions
public static Bitmap GetDesktopImage()
{

//Variable to keep the handle of the btimap.
IntPtr m_HBitmap=null;

//Variable to keep the refrence to the desktop bitmap.
System.Drawing.Bitmap bmp=null;

//In size variable we shall keep the size of the screen.
SIZE size;

//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 screen.
size.cx = PlatformInvokeUSER32.GetSystemMetrics (PlatformInvokeUSER32.SM_CXSCREEN);

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

//We create a compatible bitmap of screen size and using screen device context.
m_HBitmap = PlatformInvokeGDI32.CreateCompatibleBitmap(hDC, size.cx, size.cy);

//As m_HBitmap is IntPtr we can not check it against null. For this purspose IntPtr.Zero is used.
if (m_HBitmap!=IntPtr.Zero)
{
//Here we select the compatible bitmap in memeory device context and keeps the refrence to Old bitmap.
IntPtr hOld = (IntPtr) PlatformInvokeGDI32.SelectObject(hMemDC, m_HBitmap);

//We copy the Bitmap to the memory device context.
PlatformInvokeGDI32.BitBlt(hMemDC, 0, 0,size.cx,size.cy, 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.
PlatformInvokeGDI32.DeleteDC(hMemDC);

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

//Image is created by Image bitmap handle and assigned to Bitmap variable.
bmp=System.Drawing.Image.FromHbitmap(m_HBitmap);

//Delete the compatible bitmap object.
PlatformInvokeGDI32.DeleteObject(m_HBitmap);

return bmp;
}
//If m_HBitmap is null retunrn null.
return null;
}
#endregion
}

//This structure shall be used to keep the size of the screen.
public struct SIZE
{
public int cx;
public int cy;
}

There is also a demo applicaton with thiscode that shows the use of these classes. Its a very simple windowsapplication in which there is a simple form having a menu and a picturebox control. Click event handler of "CaptureScreen" menu item is usedto capture the screen and assign to the image property of pictureboxcontrol.

I hope you like this code. Ihave commented each line of this code to make it self explainatory. Ifthere is still something confusing for you, please let me know. GoodLuck!

Downloads

<!– demo and source files –> Download demo project – 3.14 Kb
Download source – 2.31
Kb

History

Date Posted: October 9, 2002

Most Commented Articles :

Twitter Digg Delicious Stumbleupon Technorati Facebook Email

No comments yet... Be the first to leave a reply!