c++ - C++ 中的 D3D11 屏幕捕获

标签 c++ directx-11 d3dx

是否可以在 D3D11 中截屏 DirectX 应用程序(例如游戏)?

我可以在 DirectX 9 或 API Hook (IDXGISwapChain::Present) 中轻松完成,但在 DirectX 11 中则不可能。

我初始化 D3D11 并使用游戏窗口 (FindWindow()) 创建交换链, 然后我得到 BackBuffer,

然后 ID3D11Texture2D::GetDesc() 使用它 ID3D11Device::CreateTexture2D(), 然后 ID3D11DeviceContext::CopyResource() 这给了我一个新的 ID3D11Texture2D 资源。

当我用 D3DX11SaveTextureToFile() 等常用方法保存它时,我总是得到一个黑色图像。

我忘记了什么?

谢谢。

最佳答案

我认为这里有两个步骤来检查你的代码:

  1. ID3D11DeviceContext::CopyResource() 是否按预期工作?正如我们所知,这个函数要求 src 和 des 的 desc 严格相同,是 src tex 与 des tex 有一些不同的 desc。保存前可以直接输出到窗口进行检查。

  2. D3DX11SaveTextureToFile 已弃用,取而代之的是 SaveToXXXFile(其中 XXX 是 WIC、DDS 或 TGA;WIC 不支持 DDS 和 TGA;D3DX 9 支持 TGA 作为游戏的通用艺术源格式)。 DirectXTex 和 DirectXTK 库是新的。但如果您配置适当,它现在仍然有效。检查这个函数的返回值。确保你知道如何使用

    HRESULT D3DX11SaveTextureToFile(
           ID3D11DeviceContext      *pContext,
      _In_ ID3D11Resource           *pSrcTexture,
      _In_ D3DX11_IMAGE_FILE_FORMAT DestFormat,
      _In_ LPCTSTR                  pDestFile
    );
    

关于c++ - C++ 中的 D3D11 屏幕捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36224525/

相关文章:

c++ - 如何在STL vector 矩阵中插入元素?

c++ - 通常有多少D3DXEffect?

c++ - D3DX11SaveTextureToFile 与 ID3D11ShaderResourceView

c++ - 来自 D3D 显示适配器 ID 的描述性监视器名称

c++ - 在 C++ 中,我是否为我不吃的东西买单?

c++ - 根据他们的年龄按升序显示他们的名字?

windows-phone-8 - DX11创建的纹理是白色的

c++ - 你如何在 DirectX 11 中绘制文本?

c++ - 在 Directx 中围绕特定半径的固定点旋转点?