ScreenCapture.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. //############################################################
  2. // https://github.com/yuzhengyang
  3. // author:yuzhengyang
  4. //############################################################
  5. using Azylee.Core.WindowsUtils.APIUtils;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Drawing;
  9. using System.Drawing.Imaging;
  10. using System.Linq;
  11. using System.Runtime.InteropServices;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. using System.Windows;
  15. using System.Windows.Forms;
  16. namespace Azylee.Core.DrawingUtils.ImageUtils
  17. {
  18. /// <summary>
  19. /// 屏幕捕获类
  20. /// </summary>
  21. public class ScreenCapture
  22. {
  23. /// <summary>
  24. /// Winform 屏幕截图
  25. /// </summary>
  26. /// <returns></returns>
  27. public static Bitmap Capture()
  28. {
  29. try
  30. {
  31. //获取屏幕分辨率
  32. Size size = ScreenAPI.DESKTOP;
  33. //按照屏幕宽高创建位图
  34. Bitmap bitmap = new Bitmap(size.Width, size.Height);
  35. //从一个继承自Image类的对象中创建Graphics对象
  36. Graphics gc = Graphics.FromImage(bitmap);
  37. //抓屏并拷贝到myimage里
  38. gc.CopyFromScreen(new Point(0, 0), new Point(0, 0), size);
  39. gc.Dispose();
  40. return bitmap;
  41. }
  42. catch { }
  43. return null;
  44. }
  45. #region gdi 屏幕截图
  46. /// <summary>
  47. /// 把当前屏幕捕获到位图对象中
  48. /// </summary>
  49. /// <param name="hdcDest">目标设备的句柄</param>
  50. /// <param name="nXDest">目标对象的左上角的X坐标</param>
  51. /// <param name="nYDest">目标对象的左上角的X坐标</param>
  52. /// <param name="nWidth">目标对象的矩形的宽度</param>
  53. /// <param name="nHeight">目标对象的矩形的长度</param>
  54. /// <param name="hdcSrc">源设备的句柄</param>
  55. /// <param name="nXSrc">源对象的左上角的X坐标</param>
  56. /// <param name="nYSrc">源对象的左上角的X坐标</param>
  57. /// <param name="dwRop">光栅的操作值</param>
  58. /// <returns></returns>
  59. [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
  60. private static extern bool BitBlt(
  61. IntPtr hdcDest,
  62. int nXDest,
  63. int nYDest,
  64. int nWidth,
  65. int nHeight,
  66. IntPtr hdcSrc,
  67. int nXSrc,
  68. int nYSrc,
  69. int dwRop
  70. );
  71. [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
  72. private static extern IntPtr CreateDC(
  73. string lpszDriver, // 驱动名称
  74. string lpszDevice, // 设备名称
  75. string lpszOutput, // 无用,可以设定位"NULL"
  76. IntPtr lpInitData // 任意的打印机数据
  77. );
  78. /// <summary>
  79. /// 屏幕捕获到位图对象中
  80. /// </summary>
  81. /// <returns></returns>
  82. public static Bitmap CaptureDC()
  83. {
  84. try
  85. {
  86. //创建显示器的DC
  87. IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null);
  88. //由一个指定设备的句柄创建一个新的Graphics对象
  89. Graphics g1 = Graphics.FromHdc(dc1);
  90. //根据屏幕大小创建一个与之相同大小的Bitmap对象
  91. Bitmap ScreenImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, g1);
  92. Graphics g2 = Graphics.FromImage(ScreenImage);
  93. //获得屏幕的句柄
  94. IntPtr dc3 = g1.GetHdc();
  95. //获得位图的句柄
  96. IntPtr dc2 = g2.GetHdc();
  97. //把当前屏幕捕获到位图对象中
  98. BitBlt(dc2, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc3, 0, 0, 13369376);
  99. //释放屏幕句柄
  100. g1.ReleaseHdc(dc3);
  101. //释放位图句柄
  102. g2.ReleaseHdc(dc2);
  103. g1.Dispose();
  104. g2.Dispose();
  105. return ScreenImage;
  106. }
  107. catch { return null; }
  108. }
  109. [StructLayout(LayoutKind.Sequential)]
  110. struct CURSORINFO
  111. {
  112. public int cbSize;
  113. public int flags;
  114. public IntPtr hCursor;
  115. public Point ptScreenPos;
  116. }
  117. [DllImport("user32.dll")]
  118. static extern bool GetCursorInfo(out CURSORINFO pci);
  119. private const int CURSOR_SHOWING = 0x00000001;
  120. /// <summary>
  121. /// 将鼠标指针形状绘制到屏幕截图上
  122. /// </summary>
  123. /// <param name="g"></param>
  124. public static void DrawCursorImageToScreenImage(ref Graphics g)
  125. {
  126. CURSORINFO vCurosrInfo;
  127. vCurosrInfo.cbSize = Marshal.SizeOf(typeof(CURSORINFO));
  128. GetCursorInfo(out vCurosrInfo);
  129. if ((vCurosrInfo.flags & CURSOR_SHOWING) != CURSOR_SHOWING) return;
  130. Cursor vCursor = new Cursor(vCurosrInfo.hCursor);
  131. Rectangle vRectangle = new Rectangle(new Point(vCurosrInfo.ptScreenPos.X - vCursor.HotSpot.X, vCurosrInfo.ptScreenPos.Y - vCursor.HotSpot.Y), vCursor.Size);
  132. vCursor.Draw(g, vRectangle);
  133. }
  134. #endregion
  135. }
  136. }