using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.Drawing; using System.Drawing.Imaging; namespace Capture ...{ /**//// /// This class shall keep the GDI32 APIs used in our program. /// publicsealedclass GDI32 ...{ publicconstint SRCCOPY =13369376; Class Functions#region Class Functions [DllImport("gdi32.dll", EntryPoint ="DeleteDC")] publicstaticextern IntPtr DeleteDC(IntPtr hDc); [DllImport("gdi32.dll", EntryPoint ="DeleteObject")] publicstaticextern IntPtr DeleteObject(IntPtr hDc); [DllImport("gdi32.dll", EntryPoint ="BitBlt")] publicstaticexternbool BitBlt( IntPtr hdcDest, //目的DC的句柄 int nXDest, //目的图形的左上角的x坐标 int nYDest, //目的图形的左上角的y坐标 int nWidth, //目的图形的矩形宽度 int nHeight, //目的图形的矩形高度 IntPtr hdcSrc, //源DC的句柄 int nXSrc, //源图形的左上角的x坐标 int nYSrc, //源图形的左上角的x坐标 System.Int32 dwRop //光栅操作代码 ); [DllImport("gdi32.dll", EntryPoint ="CreateCompatibleBitmap")] publicstaticextern IntPtr CreateCompatibleBitmap (IntPtr hdc, int nWidth, int nHeight); [DllImport("gdi32.dll", EntryPoint ="CreateCompatibleDC")] publicstaticextern IntPtr CreateCompatibleDC(IntPtr hdc); [DllImport("gdi32.dll", EntryPoint ="SelectObject")] publicstaticextern IntPtr SelectObject(IntPtr hdc, IntPtr bmp); #endregion } /**//// /// This class shall keep the User32 APIs used in our program. /// publicsealedclass User32 ...{ Class Variables#region Class Variables publicconstint SM_CXSCREEN =0; publicconstint SM_CYSCREEN =1; [StructLayout(LayoutKind.Sequential)] publicstruct RECT ...{ publicint left; publicint top; publicint right; publicint bottom; } #endregion Class Functions#region Class Functions [DllImport("user32.dll", EntryPoint ="GetDesktopWindow")] publicstaticextern IntPtr GetDesktopWindow(); [DllImport("user32.dll", EntryPoint ="GetDC")] publicstaticextern IntPtr GetDC(IntPtr ptr); [DllImport("user32.dll", EntryPoint ="GetSystemMetrics")] publicstaticexternint GetSystemMetrics(int abc); [DllImport("user32.dll", EntryPoint ="GetWindowDC")] publicstaticextern IntPtr GetWindowDC(IntPtr hWnd); [DllImport("user32.dll", EntryPoint ="ReleaseDC")] publicstaticextern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDc); [DllImport("user32.dll")] publicstaticextern IntPtr GetWindowRect(IntPtr hWnd, ref RECT rect); #endregion } /**//// /// This class shall keep all the functionality for capturing /// the desktop. /// publicclass CaptureScreen ...{ Class Variable Declaration#region Class Variable Declaration protectedstatic IntPtr m_HBitmap; #endregion /**////<summary> /// Creates an Image object containing a screen shot of the entire desktop ///</summary> ///<returns></returns> publicstatic Image CaptureDesktop() ...{ return CaptureWindow(User32.GetDesktopWindow()); } /**////<summary> /// Creates an Image object containing a screen shot of a specific window ///</summary> ///<param name="handle"> /// The handle to the window. (In windows forms, this is obtained by the Handle property) ///</param> ///<returns></returns> publicstatic Image CaptureWindow(IntPtr handle) ...{ // get te hDC of the target window IntPtr hdcSrc = User32.GetWindowDC(handle); // get the size User32.RECT windowRect =new User32.RECT(); User32.GetWindowRect(handle, ref windowRect); int width = windowRect.right - windowRect.left; int height = windowRect.bottom - windowRect.top; // create a device context we can copy to IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc); // create a bitmap we can copy it to, // using GetDeviceCaps to get the width/height IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, width, height); // select the bitmap object IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap); // bitblt over GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY); // restore selection GDI32.SelectObject(hdcDest, hOld); // clean up GDI32.DeleteDC(hdcDest); User32.ReleaseDC(handle, hdcSrc); // get a .NET image object for it Image img = Image.FromHbitmap(hBitmap); // free up the Bitmap object GDI32.DeleteObject(hBitmap); return img; } /**////<summary> /// Captures a screen shot of a specific window, and saves it to a file ///</summary> ///<param name="handle"></param> ///<param name="filename"></param> ///<param name="format"></param> publicstaticvoid CaptureWindowToFile(IntPtr handle, string filename, ImageFormat format) ...{ Image img = CaptureWindow(handle); img.Save(filename, format); } /**////<summary> /// Captures a screen shot of the entire desktop, and saves it to a file ///</summary> ///<param name="filename"></param> ///<param name="format"></param> publicstaticvoid CaptureScreenToFile(string filename, ImageFormat format) ...{ Image img = CaptureDesktop(); img.Save(filename, format); }