C# 实现截图软件功能实例代码
发布时间 - 2026-01-11 01:50:07 点击率:次本文是利用C# 开发截图软件的小例子,以供学习分享使用。

思路:
- 截取屏幕图片。
- 获取要截取的范围,即左上角,右下角坐标
- 填充到PictureBox中。
- 笔触功能,荧光笔,矩形,橡皮擦,复制,保存功能
涉及的知识点:
- 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如何使用模型观察者?(Observer代码示例)
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
如何制作一个表白网站视频,关于勇敢表白的小标题?
JavaScript中的标签模板是什么_它如何扩展字符串功能
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
Laravel如何自定义错误页面(404, 500)?(代码示例)
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
Android实现代码画虚线边框背景效果
详解Android中Activity的四大启动模式实验简述
如何用已有域名快速搭建网站?
如何在腾讯云服务器上快速搭建个人网站?
Python进程池调度策略_任务分发说明【指导】
Android中AutoCompleteTextView自动提示
简历没回改:利用AI润色让你的文字更专业
nginx修改上传文件大小限制的方法
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
,在苏州找工作,上哪个网站比较好?
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
微信小程序 配置文件详细介绍
html如何与html链接_实现多个HTML页面互相链接【互相】
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
如何快速搭建高效香港服务器网站?
Laravel API资源类怎么用_Laravel API Resource数据转换
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
微信公众帐号开发教程之图文消息全攻略
JavaScript如何实现路由_前端路由原理是什么
如何快速搭建高效服务器建站系统?
如何在阿里云香港服务器快速搭建网站?
如何快速搭建高效可靠的建站解决方案?
如何在IIS服务器上快速部署高效网站?
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
Laravel如何发送系统通知?(Notification渠道示例)
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
个人网站制作流程图片大全,个人网站如何注销?
微信h5制作网站有哪些,免费微信H5页面制作工具?
太平洋网站制作公司,网络用语太平洋是什么意思?
Laravel如何生成API文档?(Swagger/OpenAPI教程)
如何在宝塔面板中创建新站点?
javascript中闭包概念与用法深入理解

