使用C ++在Windows中截取窗口的最佳方法是什么?

42

在Windows下,使用C++拍摄正在运行的应用程序的屏幕截图,最简单的方法是什么?


1
这真的很有帮助:http://groups.google.com/group/win32-programming/browse_thread/thread/55c030edbaeaf026 - Microkernel
10
为什么这个问题被认为不相关?它询问如何以编程的方式实现,这对我来说似乎非常相关(并且并不罕见)。 - jamesdlin
5个回答

30
您需要获取窗口的设备上下文(GetWindowDC()),并从中复制图像(BitBlt())。根据您了解的应用程序的其他信息,您将使用不同的方法找到要传递给GetWindowDC()的窗口句柄。

10
请提供如何使用GetWindowDC和BitBlt获取屏幕截图的更多细节。我也想要这些详细信息。 - jondinham

13

GetDC(NULL) + BitBlt()

为了捕获半透明/alpha/分层窗口,您必须向BitBlt传递CAPTUREBLT标志,如果这样做,则光标会闪烁,请阅读此 Technet 文章以找出原因。

在 NT6+ 上,您可能可以使用放大 API来实现您想要的效果。


嗨, 谢谢你的回复。 我现在记起来了,导致鼠标指针闪烁的尝试是GetDC()+BitBlt()。这是主要的问题:( 我不想让指针闪烁...有什么方法可以无缝地获取屏幕截图吗? - Microkernel
只需不传递CAPTUREBLT标志即可。 - Anders

3

这里有一个例子 代码
你可以使用CaptureAnImage(GetDesktopWindow());来进行屏幕截图。


3
keybd_event函数文档中指出,你可以使用它来截屏并保存到剪贴板中。例如:
keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_SILENT, 0);

在我的版本中(安装在我的电脑上的Visual Studio 2005帮助文档)说明可以通过将第二个参数设置为0来截取整个桌面的屏幕截图,或者将其设置为1来截取当前应用程序的屏幕截图。
从剪贴板缓冲区中获取它留给读者作为练习。
然而,在执行此操作之前,请仔细考虑,因为它会清除剪贴板中已经存在的任何图像数据。

1
这是键盘上PrintScr键的事件。你提到的'keybd_event'不能用于截屏。真是一个概念误解! - jondinham
3
请点击我发给你的链接并查看“Remarks”部分。其中写着:“应用程序可以模拟按下“打印屏幕”键以获取屏幕截图并将其保存到剪贴板。要实现这一点,请调用keybd_event函数,将bVk参数设置为VK_SNAPSHOT。” - Dominik Grabiec
哦,好的我明白了,我不知道我们可以模拟按下打印屏幕键 :) - jondinham

-2

桌面是一种与用户交互的“虚拟”设备。因此,它潜在地包含与隐私相关的信息。我建议,在可执行文件尝试截屏时,操作系统应添加安全检查/警告提示,除非最终用户明确表示知道正在发生什么。


这并没有告诉 OP 如何编写截屏的代码... - Leonid

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