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;
        }