当前位置:首页 > 开发 > 编程语言 > C# > 正文

整理的C#屏幕截图,控件截图程序

发表于: 2012-09-28   作者:cherishLC   来源:转载   浏览次数:
C#
摘要: 代码基本从网上搜集而来,整理成以下文件: 包括屏幕截图(和屏幕上看到的一致); 以及控件截图(只要该控件在本窗口内显示完全且不被其他控件遮挡就可正确截图) using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Runt
代码基本从网上搜集而来,整理成以下文件:
包括屏幕截图(和屏幕上看到的一致);
以及控件截图(只要该控件在本窗口内显示完全且不被其他控件遮挡就可正确截图)



using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LC
{
    class ScreenCapture
    {
        #region 抓取屏幕
        /// <summary>
        /// 抓取屏幕(层叠的窗口)
        /// </summary>
        /// <param name="x">左上角的横坐标</param>
        /// <param name="y">左上角的纵坐标</param>
        /// <param name="width">抓取宽度</param>
        /// <param name="height">抓取高度</param>
        /// <returns></returns>
        public static Bitmap captureScreen(int x, int y, int width, int height)
        {
            Bitmap bmp = new Bitmap(width, height);
            using (Graphics g = Graphics.FromImage(bmp))
            {
                g.CopyFromScreen(new Point(x, y), new Point(0, 0), bmp.Size);
                g.Dispose();
            }
            //bit.Save(@"capture2.png");
            return bmp;
        }

        /// <summary>
        ///  抓取整个屏幕
        /// </summary>
        /// <returns></returns>
        public static Bitmap captureScreen()
        {
            Size screenSize = Screen.PrimaryScreen.Bounds.Size;
            return captureScreen(0,0,screenSize.Width,screenSize.Height);
        }
        #endregion

        #region 使用BitBlt方法抓取控件,无论控件是否被遮挡
        /// <summary>
        /// 控件(窗口)的截图,控件被其他窗口(而非本窗口内控件)遮挡时也可以正确截图,使用BitBlt方法
        /// </summary>
        /// <param name="control">需要被截图的控件</param>
        /// <returns>该控件的截图,控件被遮挡时也可以正确截图</returns>
        public static Bitmap captureControl(Control control)
        {
            //调用API截屏
            IntPtr hSrce = GetWindowDC(control.Handle);
            IntPtr hDest = CreateCompatibleDC(hSrce);
            IntPtr hBmp = CreateCompatibleBitmap(hSrce, control.Width, control.Height);
            IntPtr hOldBmp = SelectObject(hDest, hBmp);
            if (BitBlt(hDest, 0, 0, control.Width, control.Height, hSrce, 0, 0, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt))
            {
                Bitmap bmp = Image.FromHbitmap(hBmp);
                SelectObject(hDest, hOldBmp);
                DeleteObject(hBmp);
                DeleteDC(hDest);
                ReleaseDC(control.Handle, hSrce);
                // bmp.Save(@"a.png");
                // bmp.Dispose();
                return bmp;
            }
            return null;

        }

//         /// <summary>
//         /// 有问题!!!!!用户区域坐标不对啊
//         /// 控件(窗口)的用户区域截图,控件被其他窗口(而非本窗口内控件)遮挡时也可以正确截图,使用BitBlt方法
//         /// </summary>
//         /// <param name="control">需要被截图的控件</param>
//         /// <returns>控件(窗口)的用户区域截图</returns>
//         public static Bitmap captureClientArea(Control control)
//         {
// 
//             Size sz = control.Size;
//             Rectangle rect = control.ClientRectangle;
//             
// 
//             //调用API截屏
//             IntPtr hSrce = GetWindowDC(control.Handle);
//             IntPtr hDest = CreateCompatibleDC(hSrce);
//             IntPtr hBmp = CreateCompatibleBitmap(hSrce, rect.Width, rect.Height);
//             IntPtr hOldBmp = SelectObject(hDest, hBmp);
//             if (BitBlt(hDest, 0, 0, rect.Width, rect.Height, hSrce, rect.X, rect.Y, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt))
//             {
//                 Bitmap bmp = Image.FromHbitmap(hBmp);
//                 SelectObject(hDest, hOldBmp);
//                 DeleteObject(hBmp);
//                 DeleteDC(hDest);
//                 ReleaseDC(control.Handle, hSrce);
//                 // bmp.Save(@"a.png");
//                 // bmp.Dispose();
//                 return bmp;
//             }
//             return null;
// 
//         }
        #endregion


        #region 使用PrintWindow方法抓取窗口,无论控件是否被遮挡
        /// <summary>
        /// 窗口的截图,窗口被遮挡时也可以正确截图,使用PrintWindow方法
        /// </summary>
        /// <param name="control">需要被截图的窗口</param>
        /// <returns>窗口的截图,控件被遮挡时也可以正确截图</returns>
        public static Bitmap captureWindowUsingPrintWindow(Form form)
        {
            return GetWindow(form.Handle);
        }


        private static Bitmap GetWindow(IntPtr hWnd)
        {
            IntPtr hscrdc = GetWindowDC(hWnd);
            Control control = Control.FromHandle(hWnd);
            IntPtr hbitmap = CreateCompatibleBitmap(hscrdc, control.Width, control.Height);
            IntPtr hmemdc = CreateCompatibleDC(hscrdc);
            SelectObject(hmemdc, hbitmap);
            PrintWindow(hWnd, hmemdc, 0);
            Bitmap bmp = Bitmap.FromHbitmap(hbitmap);
            DeleteDC(hscrdc);//删除用过的对象
            DeleteDC(hmemdc);//删除用过的对象
            return bmp;
        }
        #endregion

        #region  DLL calls
        [DllImport("gdi32.dll")]
        static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int
        wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, CopyPixelOperation rop);
        [DllImport("gdi32.dll")]
        static extern IntPtr DeleteDC(IntPtr hDc);
        [DllImport("gdi32.dll")]
        static extern IntPtr DeleteObject(IntPtr hDc);
        [DllImport("gdi32.dll")]
        static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);
        [DllImport("gdi32.dll")]
        static extern IntPtr CreateCompatibleDC(IntPtr hdc);
        [DllImport("gdi32.dll")]
        static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp);
        [DllImport("user32.dll")]
        public static extern IntPtr GetDesktopWindow();
        [DllImport("user32.dll")]
        public static extern IntPtr GetWindowDC(IntPtr ptr);
        [DllImport("user32.dll")]
        public static extern bool PrintWindow(IntPtr hwnd, IntPtr hdcBlt, UInt32 nFlags);
        [DllImport("user32.dll")]
        static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDc);
        #endregion
    }
}

整理的C#屏幕截图,控件截图程序

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
因为近来想写个类似于远程桌面监控的程序,该程序中要用到屏幕捕捉.为实现该程序的一部分功能,做了个
因为近来想写个类似于远程桌面监控的程序,该程序中要用到屏幕捕捉.为实现该程序的一部分功能,做了个
因为近来想写个类似于远程桌面监控的程序,该程序中要用到屏幕捕捉.为实现该程序的一部分功能,做了个
刚申请博客不久,就爱上这里看别人的技术博,感觉很不错哦。 上午看了Create Chen的博客,以及他提
截图程序的代码参考了一个印度人的博客还有周银辉的博客, 这两位都是用WPF做的, 在截图的时候半透明
效果图挺恶心,哈哈哈! [img] [/img] 布局文件就一个Button <?xml version="1.0" encoding="utf-
平时在做ppt进行工作汇报的时候,有时候需要对截取的图形进行标注,方便讲述,这样的操作用QQ截图是
  最近在做一个WinCE的项目,需要产品推广,固需要程序的截图。那么,怎么样在WinCE下实现屏幕截
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(6)----全屏截图、图标获取、图片打印、页面
公司里不知道搞了网络什么限制,我这个机器自古以来上午都登不上腾讯QQ客户端,每次都是上午用WebQQ
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号