C#实现Windows桌面截图功能...

  • 摘要: 本文描述了如何使用C#简单实现系统桌面截图功能。
  • 导航: mp.weixin.qq.com/s/2VeOsBupsn7dmNZvkiiaww
  • 作者: 编程笔记in
  • 前言

    • 在学习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
    • 如果你觉得这篇文章对你有帮助,不妨点个赞再走呗!
    • 如有其他疑问,欢迎评论区留言讨论!
    • 也可以关注微信公众号 [编程笔记in] ,一起交流学习!

❖ 感 谢 您 的 关 注 ❖


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程笔记in

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值