ScreenCapture.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. //############################################################
  2. // https://github.com/yuzhengyang
  3. // author:yuzhengyang
  4. //############################################################
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Drawing;
  8. using System.Linq;
  9. using System.Runtime.InteropServices;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using System.Windows.Forms;
  13. namespace Azylee.Core.IOUtils.ImageUtils
  14. {
  15. /// <summary>
  16. /// 屏幕捕获类
  17. /// </summary>
  18. public class ScreenCapture
  19. {
  20. /// <summary>
  21. /// 把当前屏幕捕获到位图对象中
  22. /// </summary>
  23. /// <param name="hdcDest">目标设备的句柄</param>
  24. /// <param name="nXDest">目标对象的左上角的X坐标</param>
  25. /// <param name="nYDest">目标对象的左上角的X坐标</param>
  26. /// <param name="nWidth">目标对象的矩形的宽度</param>
  27. /// <param name="nHeight">目标对象的矩形的长度</param>
  28. /// <param name="hdcSrc">源设备的句柄</param>
  29. /// <param name="nXSrc">源对象的左上角的X坐标</param>
  30. /// <param name="nYSrc">源对象的左上角的X坐标</param>
  31. /// <param name="dwRop">光栅的操作值</param>
  32. /// <returns></returns>
  33. [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
  34. private static extern bool BitBlt(
  35. IntPtr hdcDest,
  36. int nXDest,
  37. int nYDest,
  38. int nWidth,
  39. int nHeight,
  40. IntPtr hdcSrc,
  41. int nXSrc,
  42. int nYSrc,
  43. int dwRop
  44. );
  45. [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
  46. private static extern IntPtr CreateDC(
  47. string lpszDriver, // 驱动名称
  48. string lpszDevice, // 设备名称
  49. string lpszOutput, // 无用,可以设定位"NULL"
  50. IntPtr lpInitData // 任意的打印机数据
  51. );
  52. /// <summary>
  53. /// 屏幕捕获到位图对象中
  54. /// </summary>
  55. /// <returns></returns>
  56. public static Bitmap Capture()
  57. {
  58. //创建显示器的DC
  59. IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null);
  60. //由一个指定设备的句柄创建一个新的Graphics对象
  61. Graphics g1 = Graphics.FromHdc(dc1);
  62. //根据屏幕大小创建一个与之相同大小的Bitmap对象
  63. Bitmap ScreenImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, g1);
  64. Graphics g2 = Graphics.FromImage(ScreenImage);
  65. //获得屏幕的句柄
  66. IntPtr dc3 = g1.GetHdc();
  67. //获得位图的句柄
  68. IntPtr dc2 = g2.GetHdc();
  69. //把当前屏幕捕获到位图对象中
  70. BitBlt(dc2, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc3, 0, 0, 13369376);
  71. //释放屏幕句柄
  72. g1.ReleaseHdc(dc3);
  73. //释放位图句柄
  74. g2.ReleaseHdc(dc2);
  75. g1.Dispose();
  76. g2.Dispose();
  77. return ScreenImage;
  78. }
  79. /// <summary>
  80. /// 压缩图片
  81. /// </summary>
  82. /// <param name="originalImage"></param>
  83. public static Bitmap MakeThumbnail(Image originalImage, int towidth, int toheight)
  84. {
  85. int x = 0;
  86. int y = 0;
  87. int ow = originalImage.Width;
  88. int oh = originalImage.Height;
  89. //新建一个bmp图片
  90. Bitmap bitmap = new Bitmap(towidth, toheight);
  91. //新建一个画板
  92. Graphics g = Graphics.FromImage(bitmap);
  93. //设置高质量插值法
  94. g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
  95. //设置低质量,高速度呈现平滑程度
  96. g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
  97. //清空画布并以透明背景色填充
  98. g.Clear(System.Drawing.Color.Transparent);
  99. //在指定位置并且按指定大小绘制原图片的指定部分
  100. g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, towidth, toheight), new System.Drawing.Rectangle(x, y, ow, oh), System.Drawing.GraphicsUnit.Pixel);
  101. return bitmap;
  102. }
  103. [StructLayout(LayoutKind.Sequential)]
  104. struct CURSORINFO
  105. {
  106. public int cbSize;
  107. public int flags;
  108. public IntPtr hCursor;
  109. public Point ptScreenPos;
  110. }
  111. [DllImport("user32.dll")]
  112. static extern bool GetCursorInfo(out CURSORINFO pci);
  113. private const int CURSOR_SHOWING = 0x00000001;
  114. /// <summary>
  115. /// 将鼠标指针形状绘制到屏幕截图上
  116. /// </summary>
  117. /// <param name="g"></param>
  118. public static void DrawCursorImageToScreenImage(ref Graphics g)
  119. {
  120. CURSORINFO vCurosrInfo;
  121. vCurosrInfo.cbSize = Marshal.SizeOf(typeof(CURSORINFO));
  122. GetCursorInfo(out vCurosrInfo);
  123. if ((vCurosrInfo.flags & CURSOR_SHOWING) != CURSOR_SHOWING) return;
  124. Cursor vCursor = new Cursor(vCurosrInfo.hCursor);
  125. Rectangle vRectangle = new Rectangle(new Point(vCurosrInfo.ptScreenPos.X - vCursor.HotSpot.X, vCurosrInfo.ptScreenPos.Y - vCursor.HotSpot.Y), vCursor.Size);
  126. vCursor.Draw(g, vRectangle);
  127. }
  128. }
  129. }