讲师中心 微信公众号
AI工具推荐 视频效率加速

c# 如何进行屏幕截图

星宇同学_6481

星宇同学_6481

发布时间:2026-02-06 08:16:02

|

627人浏览过

|

来源于php中文网

原创

最直接有效的全屏截图方式是用System.Drawing.Graphics.CopyFromScreen配合Screen.PrimaryScreen.Bounds获取准确坐标,但默认不捕获鼠标指针;需通过P/Invoke调用GetCursorInfo手动绘制光标,并注意高DPI换算、多屏遍历及剪切板兼容性问题。

c# 如何进行屏幕截图

用 C# 做全屏截图,最直接有效的方式是靠 System.Drawing + Graphics.CopyFromScreen,但必须注意:它默认不捕获鼠标指针,且在高 DPI 或多显示器环境下容易偏移、截错区域。

如何用 Graphics.CopyFromScreen 截取主屏

这是最轻量、无需 P/Invoke 的方案,适合快速原型或单显示器常规场景。关键在于坐标和尺寸必须严格对齐屏幕边界,不能硬写 0, 0 就完事——尤其当任务栏在顶部/左侧、或启用了“缩放与布局”时,Screen.PrimaryScreen.Bounds 才是唯一可信的源。

  • CopyFromScreen 第 1–2 个参数是源左上角屏幕坐标(不是客户端坐标),第 3–4 个是目标位图左上角(通常为 0, 0)
  • 务必用 using (var g = Graphics.FromImage(bitmap)) 包裹,否则 Graphics 对象不释放会导致 GDI 句柄泄漏
  • 保存前建议调用 bitmap.SetResolution(96, 96),避免某些图像查看器误判 DPI 导致显示过小
Rectangle bounds = Screen.PrimaryScreen.Bounds;
using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
{
    using (Graphics g = Graphics.FromImage(bitmap))
    {
        g.CopyFromScreen(bounds.Location, Point.Empty, bounds.Size);
    }
    bitmap.Save("screen.png", ImageFormat.Png);
}

为什么截图里没有鼠标?怎么加上去

因为 Windows 把鼠标渲染在独立的硬件叠加层(cursor overlay),CopyFromScreen 只读显存中的桌面合成结果,根本看不到指针。要加鼠标,必须手动获取并绘制:

  • 调用 User32.GetCursorInfo(需 P/Invoke)拿到当前光标句柄、位置和可见状态
  • 用 Icon.FromHandle 把 HCURSOR 转成 Icon,再用 graphics.DrawIcon 绘制到截图位图上
  • 高 DPI 下,GetCursorInfo.ptScreenPos 返回的是物理像素坐标,而你的 Bitmap 是逻辑尺寸,必须用 Graphics.DpiX/Y 换算或启用 Per-Monitor DPI 感知

跳过这步,用户会奇怪“我明明在点按钮,截图里鼠标哪去了?”

Handsfree Windows Control
Handsfree Windows Control

通过 handsfree-windows CLI控制 Windows 本机应用 (UIA) 和浏览器 (Playwright) 的引导技能,用于自动化或测试桌面应用。

下载

多显示器或非主屏截图怎么处理

Screen.PrimaryScreen 只返回主显示器,如果用户想截扩展屏(比如右侧副屏),必须遍历 Screen.AllScreens 并按需选择。常见错误是直接用 Screen.AllScreens[1].Bounds,但数组顺序不保证和物理布局一致。

  • 用 Screen.FromPoint(Cursor.Position) 可定位当前鼠标所在屏,适合“点击即截”场景
  • 若要截全部显示器拼接图,需计算所有 Screen.Bounds 的联合矩形(Rectangle.Union),再创建超大 Bitmap,逐屏 CopyFromScreen
  • 注意:跨屏截图总宽高可能超过 32767 像素(short.MaxValue),此时 Bitmap 构造会抛 ArgumentException,得拆成多张保存

剪切板集成与常见兼容性坑

把截图塞进剪切板比保存文件更常用,但 Clipboard.SetImage 在 .NET 5+ 和 .NET Framework 行为不同:

  • .NET Framework:支持直接传 Bitmap
  • .NET 5/6/7+:只接受 ImageSource(WPF)或需转 MemoryStream + DataObject,否则抛 NotSupportedException
  • WinForms 应用中,必须确保调用线程是 STA([STAThread] 主入口),否则 Clipboard 操作静默失败
  • 截图后立即调用 Clipboard.SetImage,别等 UI 线程空闲——容易被其他程序抢占剪切板

真正难的从来不是“怎么截”,而是“截得准、指针在、多屏对、粘贴稳”。尤其是 DPI 缩放和光标合成这两块,90% 的线上 bug 都出在这儿。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

更多
c语言union的用法
c语言union的用法

c语言union的用法是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型,union的使用可以帮助我们节省内存空间,并且可以方便地在不同的数据类型之间进行转换。使用union时需要注意对应的成员是有效的,并且只能同时访问一个成员。本专题为大家提供union相关的文章、下载、课程内容,供大家免费下载体验。

729

2023.09.27

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

359

2026.04.23

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4278

2023.08.10

CSS position定位有几种方式
CSS position定位有几种方式

有4种,分别是静态定位、相对定位、绝对定位和固定定位。更多关于CSS position定位有几种方式的内容,可以访问下面的文章。

352

2023.11.23

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3259

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2838

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

1488

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2599

2023.08.02

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Conan 2 安装指南
Conan 2 安装指南

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn