C++ DirectX屏幕截图:为什么GetBackBuffer总是给我一个黑色图像?

C++ DirectX屏幕截图:为什么GetBackBuffer总是给我一个黑色图像?,c++,directx,C++,Directx,我的问题是使用DirectX捕获全屏图像,无论运行什么应用程序。我试图通过使用GetBackBuffer函数捕获屏幕(因为有人警告我GetFrontBufferData非常慢,与GDI一样慢) 然而,当我尝试它时,GetFrontBufferData可以很好地捕捉屏幕,但是GetBackBuffer总是给我一个黑色图像 有人告诉我GetBackBuffer只获取屏幕上绘制的内容。如果你什么也不画,你什么也得不到。如果要使用GetBackBuffer函数捕获屏幕图像,这是不可能的。是这样吗 我尝试

我的问题是使用DirectX捕获全屏图像,无论运行什么应用程序。我试图通过使用GetBackBuffer函数捕获屏幕(因为有人警告我GetFrontBufferData非常慢,与GDI一样慢)

然而,当我尝试它时,GetFrontBufferData可以很好地捕捉屏幕,但是GetBackBuffer总是给我一个黑色图像

有人告诉我GetBackBuffer只获取屏幕上绘制的内容。如果你什么也不画,你什么也得不到。如果要使用GetBackBuffer函数捕获屏幕图像,这是不可能的。是这样吗

我尝试的代码是:

LPDIRECT3D9 g_pD3D = NULL;
D3DDISPLAYMODE ddm;
D3DPRESENT_PARAMETERS d3dpp;
IDirect3DDevice9 * g_pd3dDevice;
IDirect3DSurface9 * pSurface;
ZeroMemory(&d3dpp, sizeof(D3DPRESENT_PARAMETERS));
ZeroMemory(&d3dpp, sizeof(d3dpp));
g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &ddm);
d3dpp.Windowed = TRUE;
d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
d3dpp.BackBufferFormat = ddm.Format;
d3dpp.BackBufferHeight = ddm.Height;
d3dpp.BackBufferWidth = ddm.Width;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = GetDesktopWindow();
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
HRESULT hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow(), D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice);
hr = g_pd3dDevice->CreateOffscreenPlainSurface(ddm.Width, ddm.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pSurface, NULL);
//hr = g_pd3dDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pSurface);//Getbackbuffer gives me a black image
hr = g_pd3dDevice->GetFrontBufferData(0, pSurface);//getfrontbufferdata works well
hr = D3DXSaveSurfaceToFile("d:/1.png", D3DXIFF_PNG, pSurface, NULL, NULL);
pSurface->UnlockRect();
pSurface->Release();
g_pd3dDevice->Release();
g_pD3D->Release();


那些告诉你GetBackbuffer只得到你画的东西的人告诉了你真相。每个使用Direct3D的应用程序都有自己的后台缓冲区,这些后台缓冲区只包含该应用程序在其中绘制的内容。您的应用程序有自己的后台缓冲区,只包含您的应用程序所绘制的内容。

告诉您GetBackbuffer只获取您绘制的内容的人告诉了您真相。每个使用Direct3D的应用程序都有自己的后台缓冲区,这些后台缓冲区只包含该应用程序在其中绘制的内容。您的应用程序有自己的后台缓冲区,只包含您的应用程序所绘制的内容。

告诉您GetBackbuffer只获取您绘制的内容的人告诉了您真相。每个使用Direct3D的应用程序都有自己的后台缓冲区,这些后台缓冲区只包含该应用程序在其中绘制的内容。您的应用程序有自己的后台缓冲区,只包含您的应用程序所绘制的内容。

告诉您GetBackbuffer只获取您绘制的内容的人告诉了您真相。每个使用Direct3D的应用程序都有自己的后台缓冲区,这些后台缓冲区只包含该应用程序在其中绘制的内容。您的应用程序有自己的后台缓冲区,只包含您的应用程序提取的内容。

谢谢!另外一个问题,如果我想快速捕获整个屏幕,我应该怎么做?镜像驱动程序已被排除,因为它需要安装虚拟驱动程序并重新启动操作系统。@iouvxz您试图完成什么?我正在尝试捕获整个屏幕(每秒60帧)并将steam保存为视频。很抱歉,没有简单的方法来完成您想要的操作。您可能需要使用您提到的驱动程序,或者如果您只对单个应用程序的输出感兴趣,则可以挂接该应用程序。谢谢,您的答案非常有用。谢谢!另外一个问题,如果我想快速捕获整个屏幕,我应该怎么做?镜像驱动程序已被排除,因为它需要安装虚拟驱动程序并重新启动操作系统。@iouvxz您试图完成什么?我正在尝试捕获整个屏幕(每秒60帧)并将steam保存为视频。很抱歉,没有简单的方法来完成您想要的操作。您可能需要使用您提到的驱动程序,或者如果您只对单个应用程序的输出感兴趣,则可以挂接该应用程序。谢谢,您的答案非常有用。谢谢!另外一个问题,如果我想快速捕获整个屏幕,我应该怎么做?镜像驱动程序已被排除,因为它需要安装虚拟驱动程序并重新启动操作系统。@iouvxz您试图完成什么?我正在尝试捕获整个屏幕(每秒60帧)并将steam保存为视频。很抱歉,没有简单的方法来完成您想要的操作。您可能需要使用您提到的驱动程序,或者如果您只对单个应用程序的输出感兴趣,则可以挂接该应用程序。谢谢,您的答案非常有用。谢谢!另外一个问题,如果我想快速捕获整个屏幕,我应该怎么做?镜像驱动程序已被排除,因为它需要安装虚拟驱动程序并重新启动操作系统。@iouvxz您试图完成什么?我正在尝试捕获整个屏幕(每秒60帧)并将steam保存为视频。很抱歉,没有简单的方法来完成您想要的操作。您可能需要使用您提到的驱动程序,或者如果您只对单个应用程序的输出感兴趣,则可以挂接该应用程序。谢谢,您的回答非常有用。