今天通过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 |
- public partial class CaptureWindow : Window
- {
- private double x;
- private double y;
- private double width;
- private double height;
- private bool isMouseDown = false;
- public CaptureWindow()
- {
- InitializeComponent();
- }
- private void CaptureWindow_MouseDown(object sender, MouseButtonEventArgs e)
- {
- isMouseDown = true;
- x = e.GetPosition(null).X;
- y = e.GetPosition(null).Y;
- }
- private void CaptureWindow_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
- {
- if(isMouseDown)
- {
- // 1. 通过一个矩形来表示目前截图区域
- System.Windows.Shapes.Rectangle rect = new System.Windows.Shapes.Rectangle();
- double dx = e.GetPosition(null).X;
- double dy = e.GetPosition(null).Y;
- double rectWidth = Math.Abs(dx - x);
- double rectHeight = Math.Abs(dy - y);
- SolidColorBrush brush = new SolidColorBrush(Colors.White);
- rect.Width = rectWidth;
- rect.Height = rectHeight;
- rect.Fill = brush;
- rect.Stroke = brush;
- rect.StrokeThickness = 1;
- if (dx < x)
- {
- Canvas.SetLeft(rect, dx);
- Canvas.SetTop(rect, dy);
- }
- else
- {
- Canvas.SetLeft(rect, x);
- Canvas.SetTop(rect, y);
- }
- CaptureCanvas.Children.Clear();
- CaptureCanvas.Children.Add(rect);
- if(e.LeftButton == MouseButtonState.Released)
- {
- CaptureCanvas.Children.Clear();
- // 2. 获得当前截图区域
- width = Math.Abs(e.GetPosition(null).X - x);
- height = Math.Abs(e.GetPosition(null).Y - y);
- if(e.GetPosition(null).X > x)
- {
- CaptureScreen(x, y, width, height);
- }
- else
- {
- CaptureScreen(e.GetPosition(null).X, e.GetPosition(null).Y, width, height);
- }
- isMouseDown = false;
- x = 0.0;
- y = 0.0;
- this.Close();
- }
- }
- }
- private void CaptureScreen(double x, double y, double width, double height)
- {
- int ix = Convert.ToInt32(x);
- int iy = Convert.ToInt32(y);
- int iw = Convert.ToInt32(width);
- int ih = Convert.ToInt32(height);
- System.Drawing.Bitmap bitmap = new Bitmap(iw, ih);
- using(System.Drawing.Graphics graphics = Graphics.FromImage(bitmap))
- {
- graphics.CopyFromScreen(ix, iy, 0, 0, new System.Drawing.Size(iw, ih));
- SaveFileDialog dialog = new SaveFileDialog();
- dialog.Filter = "Png Files|*.png";
- if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
- {
- bitmap.Save(dialog.FileName, ImageFormat.Png);
- }
- }
- }
运行效果:
源代码可以点击这里下载。
如果你有其他方式实现,欢迎与我分享。如果对代码有疑问,可以在评论中指出。感谢阅读。
文章末尾固定信息

我的微信
我的微信
一个码农、工程狮、集能量和智慧于一身的、DIY高手、小伙伴er很多的、80后奶爸。
评论