C# 用API截取桌面屏幕

struct GetDeviceCapsIndex
        {
            public static readonly int DRIVERVERSION = 0;
            public static readonly int HORZSIZE = 4;
            public static readonly int VERTSIZE = 6;
            public static readonly int HORZRES = 8;
            public static readonly int VERTRES = 10;

        }
        /// 
        /// 截取部分屏幕
        /// 
        /// 左上角
        /// 右下角
        /// 是否全屏幕
        /// 返回值Bitmap
        public static Bitmap GetPartScreen(Point P1, Point P2, bool Full)
        {
            IntPtr hscrdc, hmemdc;
            IntPtr hbitmap, holdbitmap;
            int nx, ny, nx2, ny2;
            nx = ny = nx2 = ny2 = 0;
            int nwidth, nheight;
            int xscrn, yscrn;
            hscrdc = CreateDC("DISPLAY", null, null, 0);//创建DC句柄
            hmemdc = CreateCompatibleDC(hscrdc);//创建一个内存DC
            xscrn = GetDeviceCaps(hscrdc, GetDeviceCapsIndex.HORZRES);//获取屏幕宽度
            yscrn = GetDeviceCaps(hscrdc, GetDeviceCapsIndex.VERTRES);//获取屏幕高度
            if (Full)//如果是截取整个屏幕
            {
                nx = 0;
                ny = 0;
                nx2 = xscrn;
                ny2 = yscrn;
            }
            else
            {
                nx = P1.X;
                ny = P1.Y;
                nx2 = P2.X;
                ny2 = P2.Y;
                //检查数值合法性
                if (nx < 0) nx = 0;
                if (ny < 0) ny = 0;
                if (nx2 > xscrn) nx2 = xscrn;
                if (ny2 > yscrn) ny2 = yscrn;
            }
            nwidth = nx2 - nx;//截取范围的宽度
            nheight = ny2 - ny;//截取范围的高度
            hbitmap = CreateCompatibleBitmap(hscrdc, nwidth, nheight);//从内存DC复制到hbitmap句柄
            holdbitmap = SelectObject(hmemdc, hbitmap);
            BitBlt(hmemdc, 0, 0, nwidth, nheight, hscrdc, nx, ny, (UInt32)0xcc0020);
            hbitmap = SelectObject(hmemdc, holdbitmap);
            DeleteDC(hscrdc);//删除用过的对象
            DeleteDC(hmemdc);//删除用过的对象
            return Bitmap.FromHbitmap(hbitmap);//用Bitmap.FromHbitmap从hbitmap返回Bitmap
        }

        //所用到的dll声明 
        [DllImport("gdi32.dll")]
        public static extern IntPtr CreateDC(
         string lpszDriver,        // driver name
         string lpszDevice,        // device name
         string lpszOutput,        // not used; should be NULL
         Int64 lpInitData  // optional printer data
         );

        [DllImport("gdi32.dll")]
        public static extern IntPtr CreateCompatibleDC(
         IntPtr hdc // handle to DC
         );

        [DllImport("gdi32.dll")]
        public static extern int GetDeviceCaps(
         IntPtr hdc,     // handle to DC
         int nIndex   // index of capability
        );

        [DllImport("gdi32.dll")]
        public static extern IntPtr CreateCompatibleBitmap(
         IntPtr hdc,        // handle to DC
         int nWidth,     // width of bitmap, in pixels
         int nHeight     // height of bitmap, in pixels
         );

        [DllImport("gdi32.dll")]
        public static extern IntPtr SelectObject(
         IntPtr hdc,          // handle to DC
         IntPtr hgdiobj   // handle to object
         );

        [DllImport("gdi32.dll")]
        public static extern int BitBlt(
         IntPtr hdcDest, // handle to destination DC
         int nXDest,  // x-coord of destination upper-left corner
         int nYDest,  // y-coord of destination upper-left corner
         int nWidth,  // width of destination rectangle
         int nHeight, // height of destination rectangle
         IntPtr hdcSrc,  // handle to source DC
         int nXSrc,   // x-coordinate of source upper-left corner
         int nYSrc,   // y-coordinate of source upper-left corner
         UInt32 dwRop  // raster operation code
         );

        [DllImport("gdi32.dll")]
        public static extern int DeleteDC(
         IntPtr hdc          // handle to DC
         );
原文地址:https://www.cnblogs.com/liang-ling/p/3482108.html