首页 > 解决方案 > 特定窗口的屏幕截图(HWND、HW 加速)

问题描述

我需要捕获正在使用硬件加速的特定窗口 (HWND) 的快照/屏幕截图,并将它们记录到视频流中。

在使用时BitBlt,或者PrintWindow我只能在此窗口没有硬件加速的情况下捕获图像数据,否则我会得到黑色纹理。

尝试使用User32.dll的未记录DwmGetDxSharedSurface来获取 DirectX 表面句柄。但它失败并出现错误:

ERROR_GRAPHICS_PRESENT_REDIRECTION_DISABLED - 桌面窗口管理子系统已关闭

(编辑:某些应用程序失败,即“calculator.exe”)

尝试使用Dwmapi.dll的未记录函数DwmpDxUpdateWindowSharedSurfaceDwmpDxGetWindowSharedSurface. 我已经设法检索到看起来像有效的 DirectX 表面句柄的东西。(它的 d3dFormat、宽度和高度信息是有效的) DxOpenSharedResource没有抱怨并设法创建了一个有效的ID3D11Texture2D. 问题是..所有字节都是零(得到黑色纹理)。我可能在这里做错了,或者.. 未记录的 DWM 功能在 Windows 10 上不再起作用...

编辑:我能够为某些应用程序(如 Windows 资源管理器、Paint 等)获取图像数据,但对于某些应用程序,例如 Slack,我得到全零/黑色图像。

编辑:当捕获即 VLC 时,我得到这个:在此处输入图像描述

问题:有没有其他方法可以捕获硬件加速窗口的图像数据?

注意:我不想捕获整个桌面。

标签: windowsscreenshotscreen-capturedwmscreen-recording

解决方案


您可以使用 nFlags=2 的 PrintWindow 或使用 Magnification API(排除窗口)或尝试破解 dwm.exe。


推荐阅读