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,我找不到一个示例或简单的语句来说明如何为现有窗口获取正确的对象,然后我可以从中获取缓冲区。

某个善良的灵魂至少可以显示出那个缺失的部分吗?

-约翰

4

1 回答 1

1

我不相信有一种方法可以在不捕获整个屏幕的情况下捕获前端缓冲区内容,并且后端缓冲区对于运行 Direct3D 的应用程序是私有的。只有当显卡实际将数据呈现给显示器时,才能看到前端缓冲区的内容。使用 GDI,Windows 可以访问前端和后端缓冲区,因为它自己管理它们。但是对于 Direct3D(我假设是 WPF),情况不再如此。Windows 无权访问缓冲区,因此,除非应用程序将数据提供给 Windows,否则无法获取数据,这是不可能的(没有定义这样做的消息)。

编辑:

这看起来像一个死问题,但无论如何我都会添加这个,以防其他人来寻找答案。上述问题仍然适用于以编程方式获取窗口内容。但是,当您要捕获的窗口具有键盘焦点(也就是活动窗口)时,可以在 Windows 中通过使用快捷键 ALT+Print Screen 来获取单个窗口的内容。这可能对您有帮助,也可能无济于事,但它确实捕获了相关窗口的内容,即使是 DirectX 的东西。

于 2012-01-18T03:28:19.497 回答