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

DirectX screen capture: Why GetBackBuffer always gives me a black image?

本文关键字:一个 黑色 图像 为什么 屏幕截图 GetBackBuffer DirectX      更新时间:2023-10-16

我的问题是使用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的应用程序都有自己的后台缓冲区,这些缓冲区只包含该应用程序在其中绘制的内容。您的应用程序有自己的后台缓冲区,其中只包含应用程序提取的内容。