管理

C#如何实现Windows系统桌面截图功能...

Posted on 2026-04-27 13:20  lzhdim  阅读(17)  评论(0)    收藏  举报

前言

在学习C# 的过程中,通过案例是比较高效的一种学习方式。下面我将介绍如何使用C#开发一个简单的Windows桌面截图程序。这个程序实现了基本的屏幕截图功能,包括捕获全屏、预览图像以及保存截图文件。通过该案例,可以了解到Windows窗体应用(WinForms)的开发知识,并理解GDI+绘图技术、文件对话框的使用以及事件驱动编程的核心概念。

虽然实现的功能简单,但涵盖了实际开发中的关键流程,如UI设计、功能逻辑实现、异常处理等。


知识梳理

实现功能:

1、点击按钮截图。

2、截图显示、拖动缩放、功能。

3、截图保存。

实现步骤:

1、获取屏幕边界。

2、创建位图对象。

3、屏幕内容捕获

4、内容传递。

5、显示截图编辑器窗口。


核心方法1:Screen.GetBounds(Point);

    该方法用于获取主显示器的边界矩形。

    一般从屏幕左上角(0,0)开始计算。

核心方法2:CopyFromScreen(Point,Point,Point) 

    该方法实现屏幕内容拷贝。

    参数一:源位置左上角坐标。

    参数二:目标位置左上角坐标。

    参数三:要拷贝的区域大小。

自定义显示图像窗体:FrmScreenshotEditor

控件代码在文末链接,需要者自行下载。

运行效果

 

代码

主窗体代码

主窗体中添加截图按钮,实现点击按钮截图功能,在截图前隐藏该窗体主窗体,否则会截到主窗体,添加一定的延时,否则还是会截到主窗体,因为主窗体可能未隐藏成功。截图成功后再显示主窗体和子窗体。

public partial class MainForm : Form{    public MainForm()    {        InitializeComponent();        this.CenterToParent();        this.MaximumSize = this.Size;        this.MinimumSize = this.Size;    }    private void Btn_Screenshot_Click(object sender, EventArgs e)    {        this.Hide();        Thread.Sleep(500);        Screenshot();    }    /// 截图方法    private void Screenshot()    {        try        {            // 获取屏幕尺寸            Rectangle bounds = Screen.GetBounds(Point.Empty);            // 创建位图对象            using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))            {                // 创建绘图对象                using (Graphics g = Graphics.FromImage(bitmap))                {                    // 将屏幕内容复制到位图中                    g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size);                }                this.Show();                //显示图像                FrmScreenshotEditor frmScreenshotEditor = new FrmScreenshotEditor();                frmScreenshotEditor.Image = bitmap;                frmScreenshotEditor.ShowDialog();            }        }        catch (Exception ex)        {            MessageBox.Show($"截图失败: {ex.Message}", "错误",MessageBoxButtons.OK, MessageBoxIcon.Error);        }    }}

截图编辑窗体

在截图编辑子窗体中添加自定义图像显示控件,该控件需要实现图像的滚动和缩放功能。添加一个Image属性,用于设置显示的图片。最后添加一个保存按钮,实现图像保存功能。

public partial class FrmScreenshotEditor :WinFormBase {     public Image Image     {         get => uvCanvas.Image;         set         {             uvCanvas.Image = value;             Invalidate();         }     }     public FrmScreenshotEditor()     {         InitializeComponent();         this.CenterToParent();         this.WindowState = FormWindowState.Maximized;     }     private void btn_Save_Click(object sender, System.EventArgs e)     {         SaveFileDialog  saveFileDialog = new SaveFileDialog();         saveFileDialog.FileName = "截图1";     //设置初始文件名         saveFileDialog.Filter= "PNG Image|*.png|JPEG Image|*.jpg|BMP Image|*.bmp";         if (saveFileDialog.ShowDialog()== DialogResult.OK)         {             string extension = Path.GetExtension(saveFileDialog.FileName).ToLower();             ImageFormat imageFormat;             switch (extension)             {                 case ".png":                     imageFormat = ImageFormat.Png;                     break;                 case ".jpg":                     imageFormat = ImageFormat.Jpeg;                     break;                 case ".bmp":                     imageFormat = ImageFormat.Bmp;                     break;                 default:                     imageFormat = ImageFormat.Png;                     break;             }             try             {                 Image.Save(saveFileDialog.FileName, imageFormat);                 MessageBox.Show($"图片已成功保存至: {saveFileDialog.FileName}");             }             catch (Exception ex)             {                 MessageBox.Show($"保存图片时出错: {ex.Message}");             }         }     } }

总结

通过实现案例学习编程是一种高效的学习方法。这种学习方式将抽象概念具体化。通过上面的截图程序,我们实际应用了窗体控件、事件处理、GDI+绘图等核心知识点,比单纯学习理论更容易理解和记忆。其次通过案例可以获得正向反馈,看到自己编写的代码真正实现功能,极大提升了学习动力和成就感。最后,该案例后面可以自己扩展性,当你掌握了更多的基础知识后,可以逐步添加区域选择、图像编辑等更高级的功能。

项目源码:gitee.com/incodenotes/cshape-demos

 

 

Copyright © 2000-2022 Lzhdim Technology Software All Rights Reserved