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

Windows 如何将Direct3D/WPF/DWM窗口捕获为位图?,windows,direct3d,image-capture,Windows,Direct3d,Image Capture,捕获窗口图像的正常方法是调用: HDC SharedWndDC = GetWindowDC(SharedWnd); BitBlt(BitmapDC, 0, 0, width, height, SharedWndDC, 0, 0, SRCCOPY /* |CAPTUREBLT */); ReleaseDC(SharedWnd, SharedWndDC); 在一个运行DWM的系统上,它很好地抓住了正在讨论的窗口,即使它被其他窗口重叠或部分脱离屏幕,等等 但,它在某些窗口(可能是那个些使用WPF的窗

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

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

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

编辑:

这看起来像是一个死板的问题,但我还是要补充一下,以防有人来寻找答案。上述问题仍然适用于以编程方式获取窗口内容。但是,当要捕获的窗口具有键盘焦点(也称为活动窗口)时,可以在Windows中使用快捷键ALT+Print屏幕获取单个窗口的内容。这可能对您有帮助,也可能没有帮助,但它确实捕获了相关窗口的内容,即使是DirectX内容