C++ DirectX屏幕截图不工作?

C++ DirectX屏幕截图不工作?,c++,directx,directx-11,C++,Directx,Directx 11,我正在尝试使用DirectX截图,然后将其保存到文件中。 但是当下面的代码执行时,我得到了一个完全黑色的.png大小(宽度/高度)的目标DirectX应用程序。我做错了什么 HRESULT hr = S_OK; ID3D11Texture2D* pBuffer; ID3D11Texture2D* pBackBufferStaging = NULL; pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBu

我正在尝试使用DirectX截图,然后将其保存到文件中。 但是当下面的代码执行时,我得到了一个完全黑色的.png大小(宽度/高度)的目标DirectX应用程序。我做错了什么

HRESULT hr = S_OK;

ID3D11Texture2D* pBuffer;
ID3D11Texture2D* pBackBufferStaging = NULL;

pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBuffer);

D3D11_TEXTURE2D_DESC td;
pBuffer->GetDesc(&td);
td.Usage = D3D11_USAGE_STAGING;
td.BindFlags = 0;
td.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
td.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
td.MiscFlags &= D3D11_RESOURCE_MISC_TEXTURECUBE;

pDevice->CreateTexture2D(&td, NULL, &pBackBufferStaging);
pContext->CopyResource(pBackBufferStaging, pBuffer);

D3DX11SaveTextureToFile(pContext, pBackBufferStaging, D3DX11_IFF_PNG, L"D:\\screen.png");

pBackBufferStaging->Release();
pBuffer->Release();
pSwapChain
是指向
IDXGISwapChain
的指针,
pDevice
是指向
ID3D11Device
的指针,
pContext
是指向
ID3D11DeviceContext
的指针。它们都设置正确,但生成的屏幕截图仍然是黑色的

更新#1 错误检查没有显示任何内容。所有功能都已成功执行。在DirectX 11“Hello world”中,一切正常。我做错了什么?我正在试着用屏幕拍摄一个坦克世界的游戏

更新#2
在DirectX 9上,我的方法效果很好-Heartstone会生成工作屏幕截图。

尝试将以下纹理描述传递给CreateTexture2D:

D3D11_TEXTURE2D_DESC td;
pBuffer->GetDesc( &td);
td.BindFlags = 0;
td.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
td.Usage = D3D11_USAGE_STAGING;

不要设置td.Format和td.miscs标志

尝试将以下纹理描述传递给CreateTexture2D:

D3D11_TEXTURE2D_DESC td;
pBuffer->GetDesc( &td);
td.BindFlags = 0;
td.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
td.Usage = D3D11_USAGE_STAGING;

不要设置td.Format和td.miscs标志

您是想获取自己应用程序的屏幕截图,还是桌面截图? 如果它是另一个应用程序,你是如何得到它的交换链的? 如果您使用的是Windows 8+,则可以使用


顺便说一句,您可以在创建设备(D3D11CreateDevice或D3D11CreateDeviceAndSwapChain)时传递标志D3D11_CREATE_DEVICE_DEBUG,然后检查调试输出。它可能会给你一些重要的线索。

你是想得到你自己的应用程序的屏幕截图,还是桌面截图? 如果它是另一个应用程序,你是如何得到它的交换链的? 如果您使用的是Windows 8+,则可以使用


顺便说一句,您可以在创建设备(D3D11CreateDevice或D3D11CreateDeviceAndSwapChain)时传递标志D3D11_CREATE_DEVICE_DEBUG,然后检查调试输出。它可能会给你一些重要的线索。

错误检查不是可选的。@HansPassant问题不是关于这个。正如我所说,它们被正确地钩住了。所以问题是这里出了什么问题好吧,你没有错误检查,这就是为什么你不知道出了什么问题。@VioletGiraffe好的,有了错误检查,没有出现错误,但屏幕截图仍然是黑色的。WoT游戏?某些DRM保护可能会妨碍您的工作-当您仅使用打印屏幕时,行为是否相同?错误检查不是可选的。@HansPassant问题不在于此。正如我所说,它们被正确地钩住了。所以问题是这里出了什么问题好吧,你没有错误检查,这就是为什么你不知道出了什么问题。@VioletGiraffe好的,有了错误检查,没有出现错误,但屏幕截图仍然是黑色的。WoT游戏?某些DRM保护可能会妨碍您的工作—当您仅使用打印屏幕时,行为是否相同?