C++ 截图C++;directx获得黑色图像
我正在尝试用directx拍摄屏幕截图。我尝试了好几页的代码,解释了如何拍摄,但总是得到一张黑屏截图。如果有人能帮助我,我将不胜感激 我的代码是:C++ 截图C++;directx获得黑色图像,c++,visual-c++,directx,screenshot,direct3d9,C++,Visual C++,Directx,Screenshot,Direct3d9,我正在尝试用directx拍摄屏幕截图。我尝试了好几页的代码,解释了如何拍摄,但总是得到一张黑屏截图。如果有人能帮助我,我将不胜感激 我的代码是: int _tmain(int argc, _TCHAR* argv[]) { IDirect3DDevice9* g_pd3dDevice; //SaveScreenShot("test.bmp",D3DXIFF_BMP); IDirect3DSurface9* pSurface=NULL; //IDirect3
int _tmain(int argc, _TCHAR* argv[])
{
IDirect3DDevice9* g_pd3dDevice;
//SaveScreenShot("test.bmp",D3DXIFF_BMP);
IDirect3DSurface9* pSurface=NULL;
//IDirect3DSurface9* pSource=NULL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = FALSE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferWidth = 1280;
d3dpp.BackBufferHeight = 1024;
d3dpp.hDeviceWindow = GetDesktopWindow();
d3dpp.FullScreen_RefreshRateInHz=0;
d3dpp.MultiSampleQuality=0;
IDirect3D9* direct=Direct3DCreate9(D3D9b_SDK_VERSION);
direct->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
GetDesktopWindow(),
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,&g_pd3dDevice);
//g_pd3dDevice->GetRenderTarget(0,&pSource);
g_pd3dDevice->CreateOffscreenPlainSurface(1280, 1024,
D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &pSurface, NULL);
g_pd3dDevice->GetFrontBufferData(0, pSurface);
/*g_pd3dDevice->GetRenderTargetData(pSource,pSurface);
g_pd3dDevice->GetRenderTargetData(pSource,pSurface);*/
D3DXSaveSurfaceToFile("Desktop.jpg",D3DXIFF_JPG,pSurface,NULL,NULL);
pSurface->Release();
//pSource->Release();
return 0;
}
尝试添加一些错误处理,也许您会知道它失败的原因。尝试添加一些错误处理,也许您会知道它失败的原因。我认为代码显示了一个黑色屏幕截图,因为您正在尝试保存前端缓冲区,在调用D3DXSaveSurfaceToFile()时,前端缓冲区是空的。您应该首先调用IDirect3dDevice9::Present(),或者执行以下操作:
- 在设备的后缓冲区上绘制所需内容
- 获取后缓冲区的DC句柄(源)
- 通过调用BitBlt使用GDI,将源DC的内容复制到目标DC,然后可以将其写入文件、打印等
Direct3D不会提供屏幕上显示的内容(至少根据我的经验!),只提供为其创建的窗口的客户端区域的内容。我认为代码显示的是黑色屏幕截图,因为您试图保存前端缓冲区,而在调用D3DXSaveSurfaceToFile()时,前端缓冲区是空的。您应该首先调用IDirect3dDevice9::Present(),或者执行以下操作:
- 在设备的后缓冲区上绘制所需内容
- 获取后缓冲区的DC句柄(源)
- 通过调用BitBlt使用GDI,将源DC的内容复制到目标DC,然后可以将其写入文件、打印等