原文链接:http://blog.163.com/charlie-lei@126/blog/static/113743924201051310238139/
Directx截图黑屏的原因分析可以参考:http://www.cnblogs.com/graphics/archive/2012/04/03/2117798.html
// 以下代码没有错误处理,请在实际使用中增加适当的错误处理。
//
#include "stdafx.h"
#include <d3d9.h>
#include <d3dx9.h>
#pragma comment( lib, "d3d9.lib" )
#pragma comment( lib, "d3dx9.lib" )
int Capture()
{
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->GetFrontBufferData(0, pSurface);
//---以下指令可以把‘表面’保存成内存数据
LPD3DXBUFFER bufferedImage = NULL;
hr = D3DXSaveSurfaceToFileInMemory( &bufferedImage, D3DXIFF_PNG,pSurface,NULL,NULL);
bufferedImage->Release();
//---以下指令可以把‘表面’保存成指定格式的文件(如果需要其它格式,请参考 MSDN)
hr = D3DXSaveSurfaceToFile("d:/1.png", D3DXIFF_PNG,pSurface,NULL,NULL);//s保存为png格式
pSurface->Release();
g_pd3dDevice->Release ();
g_pD3D->Release ();
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize( NULL );
Capture();
CoUninitialize();
return 0;
}