private void CaptureWindow(IntPtr handle, string fileName) { IntPtr hdcSrc = GetWindowDC(handle); RECT windowRect = new RECT(); GetWindowRect(handle, ref windowRect); int width = windowRect.right - windowRect.left; int height = windowRect.bottom - windowRect.top; width -= (width % 4); IntPtr hdcDest = GDI32Api.CreateCompatibleDC(hdcSrc); IntPtr hBitmap = GDI32Api.CreateCompatibleBitmap(hdcSrc, width, height); IntPtr hOld = GDI32Api.SelectObject(hdcDest, hBitmap); GDI32Api.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32Api.SRCCOPY); GDI32Api.SelectObject(hdcDest, hOld); GDI32Api.DeleteDC(hdcDest); User32Api.ReleaseDC(handle, hdcSrc); Image img = Image.FromHbitmap(hBitmap); ConvertTo32bpp(img, fileName); img.Dispose(); GDI32Api.DeleteObject(hBitmap); }
/// <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> public static Image CaptureWindow(IntPtr handle) { // get te hDC of the target window IntPtr hdcSrc = User32Api.GetWindowDC(handle); // get the size User32Api.RECT windowRect = new User32Api.RECT(); User32Api.GetClientRect(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 = GDI32Api.CreateCompatibleDC(hdcSrc); // create a bitmap we can copy it to, // using GetDeviceCaps to get the width/height IntPtr hBitmap = GDI32Api.CreateCompatibleBitmap(hdcSrc, width, height); // select the bitmap object IntPtr hOld = GDI32Api.SelectObject(hdcDest, hBitmap); // bitblt over GDI32Api.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32Api.SRCCOPY); // restore selection GDI32Api.SelectObject(hdcDest, hOld); // clean up GDI32Api.DeleteDC(hdcDest); User32Api.ReleaseDC(handle, hdcSrc); // get a .NET image object for it Image img = Image.FromHbitmap(hBitmap); // free up the Bitmap object GDI32Api.DeleteObject(hBitmap); return(img); }