使用.NET截取屏幕截图

41

可能是重复问题:
如何在位图中捕获屏幕?

我需要制作一个应用程序,每当按下特定按钮时,它就会捕获当前屏幕的快照。

我已经搜索了很多,但只找到了如何捕获当前窗口的方法。

请问你能帮我找出如何在.NET中实现此功能吗?

我们可以通过按“Print Screen”键并使用画图工具保存图像来手动完成此操作。但我想用程序来完成同样的事情。


@searock - 这不是重复的,我已经看过了...但它是一个半透明的窗口,我需要截取整个屏幕,包括任务栏...请再检查一下。 - Bhavik Goyal
@Bhavik Goyal,你误解了标题的意思,它是指对桌面进行截屏,甚至显示半透明的窗口。不冒犯:) - Searock
在这种情况下,您可以将代码添加到事件或函数中。 - Searock
2
@Bhavik:我不知道你想要实现什么。你通过评论澄清需求的尝试只让我更加困惑。如果你想每5分钟截取用户屏幕上可见的任何内容,那么创建一个Timer并处理它的Tick事件。在该事件中,放置我的答案中的代码。瞬间完成截图。 - Cody Gray
1
@Bhavik:你说“我不知道如何拍摄整个屏幕”,你试过我发布的代码吗?它对你无效吗?我基本上是凭记忆编写的,可能会漏掉一些东西。还要查看Gabe链接到的重复问题;那里显示的代码看起来与我的非常相似。这些示例中的一个肯定会捕获整个屏幕的图像。将其与“计时器”结合使用,可以让您每5分钟执行一次。我不明白你缺少什么?你不必解释为什么要问这个问题;你已经问了。 - Cody Gray
显示剩余8条评论
1个回答

57

使用.NET Framework可以轻松地获取屏幕截图。最简单的方法是创建一个新的Bitmap对象,并使用Graphics.CopyFromScreen方法进行绘制。

示例代码:

using (Bitmap bmpScreenCapture = new Bitmap(Screen.PrimaryScreen.Bounds.Width, 
                                            Screen.PrimaryScreen.Bounds.Height))
using (Graphics g = Graphics.FromImage(bmpScreenCapture))
{
    g.CopyFromScreen(Screen.PrimaryScreen.Bounds.X,
                     Screen.PrimaryScreen.Bounds.Y,
                     0, 0,
                     bmpScreenCapture.Size,
                     CopyPixelOperation.SourceCopy);
}

注意:此方法对于分层窗口无法正常工作。 Hans Passant在这里的答案解释了获取屏幕截图中这些窗口所需的更复杂的方法。


4
我认为它对于Windows 7+中的分层窗口能够正常工作。(这破坏了很多黑客技术,唉。) - Ry-
1
如果更改显示设置中的“所有项目的大小”为“较大”,则代码只能捕获屏幕的一部分。如何解决? - Lei Yang
如果我使用 .NET 6,这个能在 Ubuntu 上运行吗? - Saylent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接