예제 #1
0
        ScreenshotData TakeScreenshotCore(NativeInterfaces.IViewObject rpViewObject)
        {
            const int BitCount = 24;

            var rEmbedElement = rpViewObject as HTMLEmbed;
            var rWidth        = rEmbedElement.clientWidth;
            var rHeight       = rEmbedElement.clientHeight;

            var rScreenDC = NativeMethods.User32.GetDC(IntPtr.Zero);
            var rHDC      = NativeMethods.Gdi32.CreateCompatibleDC(rScreenDC);

            var rInfo = new NativeStructs.BITMAPINFO();

            rInfo.bmiHeader.biSize     = Marshal.SizeOf(typeof(NativeStructs.BITMAPINFOHEADER));
            rInfo.bmiHeader.biWidth    = rWidth;
            rInfo.bmiHeader.biHeight   = rHeight;
            rInfo.bmiHeader.biBitCount = BitCount;
            rInfo.bmiHeader.biPlanes   = 1;

            IntPtr rBits;
            var    rHBitmap   = NativeMethods.Gdi32.CreateDIBSection(rHDC, ref rInfo, 0, out rBits, IntPtr.Zero, 0);
            var    rOldObject = NativeMethods.Gdi32.SelectObject(rHDC, rHBitmap);

            var rTargetDevice = new NativeStructs.DVTARGETDEVICE()
            {
                tdSize = 0
            };
            var rRect      = new NativeStructs.RECT(0, 0, rWidth, rHeight);
            var rEmptyRect = default(NativeStructs.RECT);

            rpViewObject.Draw(1, 0, IntPtr.Zero, ref rTargetDevice, IntPtr.Zero, rHDC, ref rRect, ref rEmptyRect, IntPtr.Zero, IntPtr.Zero);

            var rResult = new ScreenshotData(rWidth, rHeight, BitCount);

            var rPixels = new byte[rWidth * rHeight * 3];

            Marshal.Copy(rBits, rPixels, 0, rPixels.Length);
            rResult.BitmapData = rPixels;

            NativeMethods.Gdi32.SelectObject(rHDC, rOldObject);
            NativeMethods.Gdi32.DeleteObject(rHBitmap);
            NativeMethods.Gdi32.DeleteDC(rHDC);
            NativeMethods.User32.ReleaseDC(IntPtr.Zero, rScreenDC);

            return(rResult);
        }
        ScreenshotData TakeScreenshotCore(NativeInterfaces.IViewObject rpViewObject)
        {
            const int BitCount = 24;

            var rEmbedElement = rpViewObject as HTMLEmbed;
            var rWidth = rEmbedElement.clientWidth;
            var rHeight = rEmbedElement.clientHeight;

            var rScreenDC = NativeMethods.User32.GetDC(IntPtr.Zero);
            var rHDC = NativeMethods.Gdi32.CreateCompatibleDC(rScreenDC);

            var rInfo = new NativeStructs.BITMAPINFO();
            rInfo.bmiHeader.biSize = Marshal.SizeOf(typeof(NativeStructs.BITMAPINFOHEADER));
            rInfo.bmiHeader.biWidth = rWidth;
            rInfo.bmiHeader.biHeight = rHeight;
            rInfo.bmiHeader.biBitCount = BitCount;
            rInfo.bmiHeader.biPlanes = 1;

            IntPtr rBits;
            var rHBitmap = NativeMethods.Gdi32.CreateDIBSection(rHDC, ref rInfo, 0, out rBits, IntPtr.Zero, 0);
            var rOldObject = NativeMethods.Gdi32.SelectObject(rHDC, rHBitmap);

            var rTargetDevice = new NativeStructs.DVTARGETDEVICE() { tdSize = 0 };
            var rRect = new NativeStructs.RECT(0, 0, rWidth, rHeight);
            var rEmptyRect = default(NativeStructs.RECT);
            rpViewObject.Draw(1, 0, IntPtr.Zero, ref rTargetDevice, IntPtr.Zero, rHDC, ref rRect, ref rEmptyRect, IntPtr.Zero, IntPtr.Zero);

            var rResult = new ScreenshotData(rWidth, rHeight, BitCount);

            var rPixels = new byte[rWidth * rHeight * 3];
            Marshal.Copy(rBits, rPixels, 0, rPixels.Length);
            rResult.BitmapData = rPixels;

            NativeMethods.Gdi32.SelectObject(rHDC, rOldObject);
            NativeMethods.Gdi32.DeleteObject(rHBitmap);
            NativeMethods.Gdi32.DeleteDC(rHDC);
            NativeMethods.User32.ReleaseDC(IntPtr.Zero, rScreenDC);

            return rResult;
        }