- 摘要: 本文描述了如何使用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] ,一起交流学习!
❖ 感 谢 您 的 关 注 ❖