//############################################################ // https://github.com/yuzhengyang // author:yuzhengyang //############################################################ using Azylee.Core.WindowsUtils.APIUtils; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Forms; namespace Azylee.Core.DrawingUtils.ImageUtils { /// /// 屏幕捕获类 /// public class ScreenCapture { /// /// Winform 屏幕截图 /// /// public static Bitmap Capture() { try { //获取屏幕分辨率 Size size = ScreenAPI.DESKTOP; //按照屏幕宽高创建位图 Bitmap bitmap = new Bitmap(size.Width, size.Height); //从一个继承自Image类的对象中创建Graphics对象 Graphics gc = Graphics.FromImage(bitmap); //抓屏并拷贝到myimage里 gc.CopyFromScreen(new Point(0, 0), new Point(0, 0), size); gc.Dispose(); return bitmap; } catch { } return null; } #region gdi 屏幕截图 /// /// 把当前屏幕捕获到位图对象中 /// /// 目标设备的句柄 /// 目标对象的左上角的X坐标 /// 目标对象的左上角的X坐标 /// 目标对象的矩形的宽度 /// 目标对象的矩形的长度 /// 源设备的句柄 /// 源对象的左上角的X坐标 /// 源对象的左上角的X坐标 /// 光栅的操作值 /// [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")] private static extern bool BitBlt( IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop ); [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")] private static extern IntPtr CreateDC( string lpszDriver, // 驱动名称 string lpszDevice, // 设备名称 string lpszOutput, // 无用,可以设定位"NULL" IntPtr lpInitData // 任意的打印机数据 ); /// /// 屏幕捕获到位图对象中 /// /// public static Bitmap CaptureDC() { try { //创建显示器的DC IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null); //由一个指定设备的句柄创建一个新的Graphics对象 Graphics g1 = Graphics.FromHdc(dc1); //根据屏幕大小创建一个与之相同大小的Bitmap对象 Bitmap ScreenImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, g1); Graphics g2 = Graphics.FromImage(ScreenImage); //获得屏幕的句柄 IntPtr dc3 = g1.GetHdc(); //获得位图的句柄 IntPtr dc2 = g2.GetHdc(); //把当前屏幕捕获到位图对象中 BitBlt(dc2, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc3, 0, 0, 13369376); //释放屏幕句柄 g1.ReleaseHdc(dc3); //释放位图句柄 g2.ReleaseHdc(dc2); g1.Dispose(); g2.Dispose(); return ScreenImage; } catch { return null; } } [StructLayout(LayoutKind.Sequential)] struct CURSORINFO { public int cbSize; public int flags; public IntPtr hCursor; public Point ptScreenPos; } [DllImport("user32.dll")] static extern bool GetCursorInfo(out CURSORINFO pci); private const int CURSOR_SHOWING = 0x00000001; /// /// 将鼠标指针形状绘制到屏幕截图上 /// /// public static void DrawCursorImageToScreenImage(ref Graphics g) { CURSORINFO vCurosrInfo; vCurosrInfo.cbSize = Marshal.SizeOf(typeof(CURSORINFO)); GetCursorInfo(out vCurosrInfo); if ((vCurosrInfo.flags & CURSOR_SHOWING) != CURSOR_SHOWING) return; Cursor vCursor = new Cursor(vCurosrInfo.hCursor); Rectangle vRectangle = new Rectangle(new Point(vCurosrInfo.ptScreenPos.X - vCursor.HotSpot.X, vCurosrInfo.ptScreenPos.Y - vCursor.HotSpot.Y), vCursor.Size); vCursor.Draw(g, vRectangle); } #endregion } }