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

编程技术  /  houtizong 发布于 3年前   137
代码基本从网上搜集而来,整理成以下文件:
包括屏幕截图(和屏幕上看到的一致);
以及控件截图(只要该控件在本窗口内显示完全且不被其他控件遮挡就可正确截图)



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

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客