惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
Hugging Face - Blog
Hugging Face - Blog
小众软件
小众软件
量子位
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
V
V2EX
阮一峰的网络日志
阮一峰的网络日志
爱范儿
爱范儿
人人都是产品经理
人人都是产品经理
博客园 - Franky
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园_首页
V
Visual Studio Blog
Last Week in AI
Last Week in AI
有赞技术团队
有赞技术团队
WordPress大学
WordPress大学
博客园 - 司徒正美
大猫的无限游戏
大猫的无限游戏
博客园 - 【当耐特】
MyScale Blog
MyScale Blog
月光博客
月光博客

博客园 - lzhdim

25个每个开发人员都应该掌握的JavaScript 数组方法 20260831 - 个人小作品更新 C#使用SQLite数据库例子 - 开源研究系列文章 20260830 - 个人小作品更新 20260829 - 个人小作品更新 13、JavaScript事件循环机制 - JavaScript学习系列文章 首款媲美分体水冷的一体水冷!微星CORELIQUID E15 360水冷散热器评测:目前为止 锐龙9 9950X3D最强性能释放 JavaScript常见的内存泄露问题 - JavaScript学习系列文章 C#开发的颜色取色器 - 开源研究系列文章 - 个人小作品 成长环境 - 我的闪存 提高 SQL 语句执行速度的方法 JavaScript安全最佳实践 关闭iPhone一些默认设置,让iPhone更流畅 20260814 - 个人小作品更新 JavaScript对象与元编程 20260812 - 个人小作品更新 JavaScript 模块化系统 Markdown 语法完全指南 C# 通过 Windows API 实现进程内存读写操作 JavaScript 函数进阶课题 C#开发的基于钩子技术监测键鼠事件的例子 - 开源项目研究文章 JavaScript异步编程的演进 近十年最帅风冷!酷冷至尊V8 ACE 3DHP散热器评测:单塔能干翻双塔 20260723 - 个人小作品更新 C# 中读取CPU、硬盘和内存温度 雷柏VT3s MAX鼠标评测:中小手型用户也没有被遗忘 顶尖性能的小号电竞鼠标来了 JavaScript 中的原型与继承 1分钟查清局域网所有IP 20260714 - 个人小作品更新 WorkBuddy 完整教程手册
C#如何实现Windows系统桌面截图功能...
lzhdim · 2026-04-27 · via 博客园 - lzhdim

前言

在学习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