0

0

c# 如何进行屏幕截图

畫卷琴夢

畫卷琴夢

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

|

507人浏览过

|

来源于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 感知

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

Image Creator
Image Creator

ImageCreator是Photoshop的免费AI插件,赋予艺术家强大的功能,如TXT2IMG、IMG2IMG、Fill和ControlNet。

下载

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

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工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

126

2023.09.27

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

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

609

2023.08.10

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

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

81

2023.11.23

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

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

951

2023.07.26

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

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

1137

2023.07.27

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

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

814

2023.08.01

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

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

456

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2355

2023.08.08

java连接字符串方法汇总
java连接字符串方法汇总

本专题整合了java连接字符串教程合集,阅读专题下面的文章了解更多详细操作。

7

2026.02.05

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.5万人学习

Excel 教程
Excel 教程

共162课时 | 15.7万人学习

PHP基础入门课程
PHP基础入门课程

共33课时 | 2.1万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号