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

推荐订阅源

L
LINUX DO - 最新话题
云风的 BLOG
云风的 BLOG
博客园 - 三生石上(FineUI控件)
人人都是产品经理
人人都是产品经理
美团技术团队
V
Visual Studio Blog
有赞技术团队
有赞技术团队
WordPress大学
WordPress大学
Hugging Face - Blog
Hugging Face - Blog
博客园 - 司徒正美
D
Docker
宝玉的分享
宝玉的分享
小众软件
小众软件
U
Unit 42
A
About on SuperTechFans
I
InfoQ
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
F
Fortinet All Blogs
Microsoft Security Blog
Microsoft Security Blog
月光博客
月光博客
G
Google Developers Blog
The Cloudflare Blog
H
Help Net Security
B
Blog
The GitHub Blog
The GitHub Blog
T
The Blog of Author Tim Ferriss
I
Intezer
P
Privacy International News Feed
V
Vulnerabilities – Threatpost
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Cyberwarzone
Cyberwarzone
C
Cyber Attacks, Cyber Crime and Cyber Security
Blog — PlanetScale
Blog — PlanetScale
C
Cisco Blogs
Project Zero
Project Zero
腾讯CDC
Help Net Security
Help Net Security
Latest news
Latest news
A
Arctic Wolf
T
The Exploit Database - CXSecurity.com
B
Blog RSS Feed
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The Hacker News
The Hacker News
P
Palo Alto Networks Blog
AI
AI
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Proofpoint News Feed
J
Java Code Geeks
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

博客园 - lzhdim

六种AI生意,从月入一万到月入十万 5个国产大模型实测对比2026:DeepSeek、Kimi、豆包、通义、智谱哪个好用 豆包、元宝、千问、Kimi、DeepSeek,这么多AI软件,到底该用哪个? 微软免费开源了一个 Linux 操作系统,没错!是微软出品 一次看懂5种咖啡冲煮方式:意式、手冲、法压、冷萃、摩卡壶到底有什么区别 120个 实用CSS 技巧汇总合集 JavaScript运算符与表达式详解 C#开发的ScreenSaver屏保应用 - 开源研究系列文章 - 个人小作品 WinForm 中跨线程操作 UI 的解决方案 JavaScript变量与数据类型详解 苹果良心!iOS 27适配设备公布:30款机型 7年前的iPhone 11还能升级 C++图形用户界面开发入门 10个不该免费的GitHub神级项目 JavaScript语言全面概述:从历史到现代实践 一张图看懂常见咖啡 C盘空间多出来4GB:谷歌服软 Chrome本地AI大模型可禁用、删除了 96GB显存运行230B大模型!七彩虹灵创K16笔记本评测:160W性能释放 AMD锐龙AI Max+ 395加持全能移动AI工作站 AI PC最强存储搭档!雷克沙NM1090 PRO 8TB固态评测:14400MB/s满速不缩水 C#已经不是当年的C#了——我用它写了个微秒级数据库引擎 EasyTool:轻量全能的 .NET 工具类库 SQL 入门 17:MySQL 数据类型:从字符串到 JSON 的全面解析 SQL 入门 16:SQL 事务隔离级别与死锁解析(易懂) 原相3955XM+TL3228主控!小米电竞鼠标2全面评测:原生双8K究竟有多强 PCIe 4.0火力全开:闪迪奥丁马仕GX 7100 NVMe SSD上手 超乎预料的千元级电竞主板!七彩虹iGame B850M Ultra-OC V14主板评测 SQL 入门 15:SQL 事务:从 ACID 到四种常见的并发问题 名人 - 我的闪存 C#性能优化技巧 SQL 入门 14:SQL 触发器与事件:自动化数据处理 38个实用的JavaScript 技巧 一款基于 .Net WinForm 开发的节点编辑器,纯 GDI 实现,体积仅 100+Kb Masuit.Tools:这个 C# 工具库 SQL 入门 13:SQL 存储过程与函数:封装逻辑与参数处理 49个 JavaScript 代码快捷技巧,让你在 2026 年成为代码高手 20260503 - 个人小作品更新 SQL 入门 12:SQL 视图:创建、修改与可更新视图 6999元AMD新旗舰首测!锐龙9 9950X3D2性能解禁:这颗U根本不是给游戏玩家造的 SQL 入门 11:日期时间格式化、IF、CASE的使用 基于C#的校时类库的实现及使用 - 开源项目研究文章
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