private Image CaptureWindow(IntPtr pHandle) { // Gets window size User32ImportClass.RECT lWindowRect = new User32ImportClass.RECT(); User32ImportClass.GetWindowRect(pHandle, ref lWindowRect); int lWindowWidth = lWindowRect.right - lWindowRect.left; int lWindowHeight = lWindowRect.bottom - lWindowRect.top; // Gets hDC of target window IntPtr lHdcSrc = User32ImportClass.GetWindowDC(pHandle); // Creates destination device context IntPtr lHdcDest = GDI32ImportClass.CreateCompatibleDC(lHdcSrc); // Creates destination bitmap IntPtr lHBitmap = GDI32ImportClass.CreateCompatibleBitmap(lHdcSrc, lWindowWidth, lWindowHeight); // Selects bitmap IntPtr lHOldObject = GDI32ImportClass.SelectObject(lHdcDest, lHBitmap); // Captures window GDI32ImportClass.BitBlt(lHdcDest, 0, 0, lWindowWidth, lWindowHeight, lHdcSrc, 0, 0, GDI32ImportClass.SRCCOPY); // Restores old selection GDI32ImportClass.SelectObject(lHdcDest, lHOldObject); // Cleans up GDI32ImportClass.DeleteDC(lHdcDest); User32ImportClass.ReleaseDC(pHandle, lHdcSrc); // Gets a Image object Image rImage = Image.FromHbitmap(lHBitmap); // Frees Bitmap object GDI32ImportClass.DeleteObject(lHBitmap); return rImage; }
private Int32[] GetBitmapInt32ArrayFromWindow(IntPtr pHandle) { // Gets window size User32ImportClass.RECT lWindowRect = new User32ImportClass.RECT(); User32ImportClass.GetWindowRect(pHandle, ref lWindowRect); this._state.Area = new Rectangle(0, 0, lWindowRect.right - lWindowRect.left, lWindowRect.bottom - lWindowRect.top); this._state.SelectedWindowOffsetX = lWindowRect.left; this._state.SelectedWindowOffsetY = lWindowRect.top; // Gets hDC of target window IntPtr lHdcSrc = User32ImportClass.GetWindowDC(pHandle); // Creates destination device context IntPtr lHdcDest = GDI32ImportClass.CreateCompatibleDC(lHdcSrc); // Creates destination bitmap IntPtr lHBitmap = GDI32ImportClass.CreateCompatibleBitmap(lHdcSrc, this._state.Area.Width, this._state.Area.Height); // Selects bitmap IntPtr lHOldObject = GDI32ImportClass.SelectObject(lHdcDest, lHBitmap); // Captures window GDI32ImportClass.BitBlt(lHdcDest, 0, 0, this._state.Area.Width, this._state.Area.Height, lHdcSrc, 0, 0, GDI32ImportClass.SRCCOPY); // Restores old selection GDI32ImportClass.SelectObject(lHdcDest, lHOldObject); // Cleans up GDI32ImportClass.DeleteDC(lHdcDest); User32ImportClass.ReleaseDC(pHandle, lHdcSrc); //Gets bitmap Bitmap lBMP = Bitmap.FromHbitmap(lHBitmap); // Frees Bitmap object GDI32ImportClass.DeleteObject(lHBitmap); // Gets bitmap data BitmapData lBMPData = lBMP.LockBits(new Rectangle(0, 0, lBMP.Width, lBMP.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); // Creates new array of Int32 to return Int32[] rArray = new Int32[this._state.Area.Width * this._state.Area.Height]; // Copies bitmap data to Int32 array Marshal.Copy(lBMPData.Scan0, rArray, 0, rArray.Length); // Returns Int32 array return rArray; }