C#屏幕截图 – Yang-Fei – 博客园

Igor C/C++/C#评论52,4401字数 2500阅读8分20秒阅读模式

今天通过C#来实现一个简单的屏幕截图功能。实现思路,获取鼠标按下去的位置和鼠标左键释放的位置,计算这个区域的宽度和高度。然后通过 Graphics.CopyFromScreen 方法便可以获取到屏幕截图了。

下面通过C#+WPF来实现这个功能,代码如下:

XAML:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Window x:Class="WPFCaptureScreenShot.CaptureWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="CaptureWindow"
AllowsTransparency="True"
WindowStyle="None"
Background="Black"
Opacity="0.1"
WindowState="Maximized"
MouseDown="CaptureWindow_MouseDown"
MouseMove="CaptureWindow_MouseMove">
    <Canvas x:Name="CaptureCanvas">
    </Canvas
</Window

 

C#屏幕截图 – Yang-Fei – 博客园-图片1
  1. public partial class CaptureWindow : Window
  2. {
  3. private double x;
  4. private double y;
  5. private double width;
  6. private double height;
  7.  
  8. private bool isMouseDown = false;
  9.  
  10. public CaptureWindow()
  11. {
  12. InitializeComponent();
  13. }
  14.  
  15. private void CaptureWindow_MouseDown(object sender, MouseButtonEventArgs e)
  16. {
  17. isMouseDown = true;
  18. x = e.GetPosition(null).X;
  19. y = e.GetPosition(null).Y;
  20. }
  21.  
  22. private void CaptureWindow_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
  23. {
  24. if(isMouseDown)
  25. {
  26. // 1. 通过一个矩形来表示目前截图区域
  27. System.Windows.Shapes.Rectangle rect = new System.Windows.Shapes.Rectangle();
  28. double dx = e.GetPosition(null).X;
  29. double dy = e.GetPosition(null).Y;
  30. double rectWidth = Math.Abs(dx - x);
  31. double rectHeight = Math.Abs(dy - y);
  32. SolidColorBrush brush = new SolidColorBrush(Colors.White);
  33. rect.Width = rectWidth;
  34. rect.Height = rectHeight;
  35. rect.Fill = brush;
  36. rect.Stroke = brush;
  37. rect.StrokeThickness = 1;
  38. if (dx < x)
  39. {
  40. Canvas.SetLeft(rect, dx);
  41. Canvas.SetTop(rect, dy);
  42. }
  43. else
  44. {
  45. Canvas.SetLeft(rect, x);
  46. Canvas.SetTop(rect, y);
  47. }
  48.  
  49. CaptureCanvas.Children.Clear();
  50. CaptureCanvas.Children.Add(rect);
  51.  
  52. if(e.LeftButton == MouseButtonState.Released)
  53. {
  54. CaptureCanvas.Children.Clear();
  55. // 2. 获得当前截图区域
  56. width = Math.Abs(e.GetPosition(null).X - x);
  57. height = Math.Abs(e.GetPosition(null).Y - y);
  58.  
  59. if(e.GetPosition(null).X > x)
  60. {
  61. CaptureScreen(x, y, width, height);
  62. }
  63. else
  64. {
  65. CaptureScreen(e.GetPosition(null).X, e.GetPosition(null).Y, width, height);
  66. }
  67.  
  68. isMouseDown = false;
  69. x = 0.0;
  70. y = 0.0;
  71. this.Close();
  72. }
  73. }
  74. }
  75.  
  76. private void CaptureScreen(double x, double y, double width, double height)
  77. {
  78. int ix = Convert.ToInt32(x);
  79. int iy = Convert.ToInt32(y);
  80. int iw = Convert.ToInt32(width);
  81. int ih = Convert.ToInt32(height);
  82.  
  83. System.Drawing.Bitmap bitmap = new Bitmap(iw, ih);
  84. using(System.Drawing.Graphics graphics = Graphics.FromImage(bitmap))
  85. {
  86. graphics.CopyFromScreen(ix, iy, 0, 0, new System.Drawing.Size(iw, ih));
  87.  
  88. SaveFileDialog dialog = new SaveFileDialog();
  89. dialog.Filter = "Png Files|*.png";
  90. if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  91. {
  92. bitmap.Save(dialog.FileName, ImageFormat.Png);
  93. }
  94. }
  95. }
C#屏幕截图 – Yang-Fei – 博客园-图片1

运行效果:

C#屏幕截图 – Yang-Fei – 博客园-图片2C#屏幕截图 – Yang-Fei – 博客园-图片2

源代码可以点击这里下载。
如果你有其他方式实现,欢迎与我分享。如果对代码有疑问,可以在评论中指出。感谢阅读。

来源: C#屏幕截图 - Yang-Fei - 博客园

文章末尾固定信息

weinxin
我的微信
我的微信
一个码农、工程狮、集能量和智慧于一身的、DIY高手、小伙伴er很多的、80后奶爸。
 
Igor
  • 本文由 Igor 发表于 2019-02-1518:03:27
c# - 异步使用MySQL DB C/C++/C#

c# – 异步使用MySQL DB

C#异步读取MySQL数据库的问题解决。 我试图了解异步使用数据库。为此,我用一个表创建了简单的MySQL数据库,然后可以通过以下方式从中获取信息: public static void SyncRe...
OpenCV在C#中应用—OpenCVSharp OpenCV

OpenCV在C#中应用—OpenCVSharp

之前一直是基于OpenCV开发视觉算法,但C++语言对于GUI的开发相对于C#来说确实很不方便,之前就了解到C#下使用OpenCV可以使用EmguCV,这段时间也确实是调通了,但是是通过把C++封装成...
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
确定

拖动滑块以完成验证
加载中...