//奇慢无比
//DXScreenCaputre.h
#pragma once
#include <d3d9.h>
#include <D3dx9tex.h>
#pragma comment(lib, "D3D9.lib")
#pragma comment(lib, "D3dx9.lib")
class CDXScreenCaputre
{
protected:
LPDIRECT3D9 g_pD3D;
LPDIRECT3DDEVICE9 g_pd3dDevice;
LPDIRECT3DSURFACE9 g_pD3DSurface;
public:
CDXScreenCaputre()
{
g_pD3D = NULL;
g_pd3dDevice = NULL;
g_pD3DSurface = NULL;
}
~CDXScreenCaputre()
{
if(g_pD3DSurface)
{
g_pD3DSurface->Release();
g_pD3DSurface = NULL;
}
if(g_pd3dDevice)
{
g_pd3dDevice->Release();
g_pd3dDevice = NULL;
}
if(g_pD3D)
{
g_pD3D->Release();
g_pD3D = NULL;
}
}
BOOL InitD3D(HWND hWnd)
{
BOOL bRet = FALSE;
do
{
HRESULT hr;
//creating a Direct3D9 object
g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if(g_pD3D == NULL)
{
bRet = -1;
break;
}
//Creates a device to represent the display adapter.
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed=true;
d3dpp.Flags=D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow=hWnd;
hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice);
if(hr != D3D_OK || g_pd3dDevice== NULL)
{
bRet = -2;
break;
}
//Retrieves the display mode
D3DDISPLAYMODE ddm ={0};
hr = g_pd3dDevice->GetDisplayMode(0, &ddm);
if(hr != D3D_OK)
{
bRet = -3;
break;
}
//Create an off-screen surface.
hr = g_pd3dDevice->CreateOffscreenPlainSurface(ddm.Width, ddm.Height,
D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &g_pD3DSurface, NULL);
if(hr != D3D_OK)
{
bRet = -4;
break;
}
bRet = 1;
}while(0);
return bRet;
}
BOOL Capture(LPCTSTR szFileName)
{
HRESULT hr = D3D_OK;
do
{
if(!(g_pd3dDevice && g_pD3DSurface))
{
hr = S_FALSE;
break;
}
//copy fornt buffer data
hr = g_pd3dDevice->GetFrontBufferData(0, g_pD3DSurface);
if(hr != D3D_OK)
{
break;
}
if(szFileName)
{
hr = D3DXSaveSurfaceToFile(szFileName, D3DXIFF_BMP, g_pD3DSurface, NULL, NULL);
}
}while(0);
return hr == D3D_OK;
}
};
//测试代码
CDXScreenCaputre m_dxSCap;
if(m_dxSCap.InitD3D(m_hWnd) > 0)
{
DWORD dwTick = GetTickCount();
int iMaxframe = 100;
for(int i=0; i<iMaxframe; i++)
{
m_dxSCap.Capture(NULL);
//m_dxSCap.Capture(_T("C:\\TEMP\\tt.bmp"));
}
dwTick = GetTickCount() - dwTick;
TRACE(_T("Average consume tick %ums for %d frames\n"), dwTick, iMaxframe);
}