示例#1
0
        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);
        }
示例#2
0
        /// <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);
        }