如何将 Direct3D/WPF/DWM 窗口捕获为位图?

3

捕获窗口图像的常规方法是调用:

HDC SharedWndDC = GetWindowDC(SharedWnd);
BitBlt(BitmapDC, 0, 0, width, height, SharedWndDC, 0, 0, SRCCOPY /* |CAPTUREBLT */);
ReleaseDC(SharedWnd, SharedWndDC);

在运行DWM的系统上,可以很好地抓取所需的窗口,即使它被其他窗口重叠或部分离屏等情况。但是,在某些窗口上(可能是使用WPF的窗口),它不能正常工作,并且会对玻璃区域进行奇怪的处理。基本上,GDI捕获无法在非GDI对象上工作。
我理解我真正想要的是抓取Direct3D的“后台缓冲区”或“前台缓冲区”,但我看到的众多示例都是用于捕获整个屏幕或桌面。由于不了解Direct3D,我找不到一个现有窗口的正确对象的示例或简单说明,然后我可以从中获取缓冲区。
有没有善良的人至少能展示一下这个缺失的部分?
——John
1个回答

2

我不相信有一种方式可以捕捉前缓冲区内容而不捕捉整个屏幕,而且后缓冲区是私有于运行Direct3D的应用程序。只有当显卡实际地将数据呈现给监视器时,前缓冲区的内容才能被看到。在GDI中,Windows可以访问前缓冲区和后缓冲区,因为它自己管理它们。但是在Direct3D(以及我假定是WPF)中,情况已经不再如此。Windows没有访问缓冲区的权限,因此,除非应用程序将其提供给Windows(不存在定义的消息来执行此操作),否则无法获取数据。

编辑:

这看起来像是一个悬而未决的问题,但我还是会添加这个内容,以防其他人需要答案。上述问题仍然适用于通过编程方式获取窗口内容。但是,在Windows中,如果要捕获具有键盘焦点(即活动窗口)的窗口时,可以利用快捷键ALT+Print Screen来获取单个窗口的内容。这可能对你有帮助,但它确实可以捕获所需窗口的内容,即使其中包含DirectX的内容。


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