C# 实现截图软件功能实例代码

发布时间 - 2026-01-11 01:50:07    点击率:

本文是利用C# 开发截图软件的小例子,以供学习分享使用。

思路:

  1. 截取屏幕图片。
  2. 获取要截取的范围,即左上角,右下角坐标
  3. 填充到PictureBox中。
  4. 笔触功能,荧光笔,矩形,橡皮擦,复制,保存功能

涉及的知识点:

  • MenuStrip:为窗体提供菜单系统。以ToolStripMenuItem为菜单子选项
  • ToolStrip:为 Windows 工具栏对象提供容器。以ToolStripButton【表示包含文本和图像的可选】为工具栏子元素
  • PictureBox:表示用于显示图像的 Windows 图片框控件。不过本文对此空间进行了重写
  • Screen:可用于获取工作屏幕区域
  • Graphics:封装一个 GDI+ 绘图图面。此类不能被继承。此类的CopyFromScreen方法用于获取屏幕图像
  • 鼠标事件:包括MouseDown,MouseMove,MouseUp事件,通过MouseEventArgs中的Location获取鼠标的位置。
  • Clipboard: 提供将数据置于系统剪贴板中以及从中检索数据的方法。此类不能被继承。
  • Cursor:设置鼠标的显示的光标的样式。
  • OnPaint:重绘事件,当控件刷新时响应此事件。

效果图如下【主要实现了截图,保存,复制,画矩形,笔触,荧光笔,橡皮擦等功能】:

保存后图片如下:

-------------------------------------------------------------------------------------------------------------------------------

核心代码如下:

截取屏幕图像:

public Bitmap GetScreen()
 {
  //获取整个屏幕图像,不包括任务栏
  Rectangle ScreenArea = Screen.GetWorkingArea(this);
  Bitmap bmp = new Bitmap(ScreenArea.Width, ScreenArea.Height);
  using (Graphics g = Graphics.FromImage(bmp))
  {
  g.CopyFromScreen(0, 0, 0, 0, new Size(ScreenArea.Width,ScreenArea.Height));
  }
  return bmp;
 }

绘制图形功能:

#region 绘制功能
 protected override void OnPaint(PaintEventArgs pe)
 {
  base.OnPaint(pe);
  Graphics g = pe.Graphics;
  DrawHistory(g);
  //绘制当前线
  if (startDraw && this.curLine.PointList != null && this.curLine.PointList.Count > 0)
  {
  DrawLine(g,this.curLine);
  }
  if (startDraw && this.curRect.Start != null && this.curRect.End != null && this.curRect.Start != this.curRect.End) {
  DrawRectangle(g, this.curRect);
  }
 }
 public void DrawHistory(Graphics g) {
  //绘制线历史记录
  if (LineHistory != null)
  {
  foreach (HLine lh in LineHistory)
  {
   if (lh.PointList.Count > 10)
   {
   DrawLine(g, lh);
   }
  }
  }
  //绘制矩形历史记录
  if (RectHistory != null)
  {
  foreach (HRectangle lh in RectHistory)
  {
   if (lh.Start!=null&& lh.End!=null && lh.Start!=lh.End)
   {
   DrawRectangle(g, lh);
   }
  }
  }
 }
 /// <summary>
 /// 绘制线
 /// </summary>
 /// <param name="g"></param>
 /// <param name="line"></param>
 private void DrawLine(Graphics g,HLine line) {
  g.SmoothingMode = SmoothingMode.AntiAlias;
  using (Pen p = new Pen(line.LineColor, line.LineWidth))
  {
  //设置起止点线帽 
  p.StartCap = LineCap.Round;
  p.EndCap = LineCap.Round;

  //设置连续两段的联接样式 
  p.LineJoin = LineJoin.Round;
  g.DrawCurve(p, line.PointList.ToArray()); //画平滑曲线 
  }
 }
 /// <summary>
 /// 绘制矩形
 /// </summary>
 /// <param name="g"></param>
 /// <param name="rect"></param>
 private void DrawRectangle(Graphics g, HRectangle rect)
 {
  g.SmoothingMode = SmoothingMode.AntiAlias;
  using (Pen p = new Pen(rect.LineColor, rect.LineWidth))
  {
  //设置起止点线帽 
  p.StartCap = LineCap.Round;
  p.EndCap = LineCap.Round;

  //设置连续两段的联接样式 
  p.LineJoin = LineJoin.Round;
  g.DrawRectangle(p, rect.Start.X, rect.Start.Y, rect.End.X - rect.Start.X, rect.End.Y - rect.Start.Y); //画平滑曲线 
  }
 }
 public void Earser(Point p0)
 {
  for (int i = lineHistory.Count - 1; i >= 0; i--)
  {
  HLine line = lineHistory[i];
  bool flag = false;
  foreach (Point p1 in line.PointList)
  {
   double distance = GetDistance(p0, p1);
   if (Math.Abs(distance) < 6)
   {
   //需要删除
   flag = true;
   break;
   }

  }
  if (flag)
  {
   lineHistory.RemoveAt(i);
  }
  }
  //擦除矩形
  for (int i = rectHistory.Count - 1; i >= 0; i--)
  {
  HRectangle rect = rectHistory[i];
  
  if (p0.X>rect.Start.X && p0.X<rect.End.X && p0.Y > rect.Start.Y && p0.Y < rect.End.Y) {
   
   rectHistory.RemoveAt(i);
  }
  }
 }
 /// <summary>
 /// 获取两点之间的距离
 /// </summary>
 /// <param name="p0"></param>
 /// <param name="p1"></param>
 /// <returns></returns>
 private double GetDistance(Point p0, Point p1) {
  return Math.Sqrt(Math.Pow((p0.X - p1.X), 2) + Math.Pow((p0.Y - p1.Y), 2));
 }
 #endregion

以下是源码功能连接,需要的朋友可以自行下载。

源码链接

以上所述是小编给大家介绍的C# 实现截图软件功能实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# c#  # 截图功能  # C#实现截图工具小项目  # C#实现QQ截图功能及相关问题  # c#实现winform屏幕截图并保存的示例  # 解决C#全屏幕截图的实现方法  # 解决C# 截取当前程序窗口指定位置截图的实现方法  # C#截图程序类似腾讯QQ截图实现代码  # C#实现类似qq的屏幕截图程序  # C#实现截图帮助类  # 鼠标  # 此类  # 历史记录  # 小编  # 两段  # 在此  # 给大家  # 重写  # 可选  # 等功能  # 不包括  # 所述  # 给我留言  # 以供  # 感谢大家  # 进行了  # 任务栏  # 可以自行  # 两点  # 疑问请 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  iOS发送验证码倒计时应用  电商网站制作价格怎么算,网上拍卖流程以及规则?  如何注册花生壳免费域名并搭建个人网站?  创业网站制作流程,创业网站可靠吗?  如何在服务器上三步完成建站并提升流量?  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  佛山企业网站制作公司有哪些,沟通100网上服务官网?  北京专业网站制作设计师招聘,北京白云观官方网站?  如何在IIS中新建站点并配置端口与IP地址?  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  Laravel安装步骤详细教程_Laravel环境搭建指南  Swift中switch语句区间和元组模式匹配  微信小程序 require机制详解及实例代码  如何快速上传建站程序避免常见错误?  如何快速打造个性化非模板自助建站?  做企业网站制作流程,企业网站制作基本流程有哪些?  javascript日期怎么处理_如何格式化输出  php打包exe后无法访问网络共享_共享权限设置方法【教程】  如何打造高效商业网站?建站目的决定转化率  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  如何快速上传自定义模板至建站之星?  Linux后台任务运行方法_nohup与&使用技巧【技巧】  如何在宝塔面板中创建新站点?  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  JavaScript常见的五种数组去重的方式  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  怎么用AI帮你设计一套个性化的手机App图标?  如何续费美橙建站之星域名及服务?  Laravel如何实现事件和监听器?(Event & Listener实战)  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  南京网站制作费用,南京远驱官方网站?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  如何用AWS免费套餐快速搭建高效网站?  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  详解Huffman编码算法之Java实现  利用 Google AI 进行 YouTube 视频 SEO 描述优化  如何选择可靠的免备案建站服务器?  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  教你用AI将一段旋律扩展成一首完整的曲子  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  如何实现建站之星域名转发设置?  如何快速重置建站主机并恢复默认配置?  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  如何在阿里云高效完成企业建站全流程?  如何在服务器上配置二级域名建站?