使用DirectX截屏

来源:互联网 发布:linux桌面启动器 编辑:程序博客网 时间:2024/06/09 01:34


//奇慢无比

//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);  }




0 0
原创粉丝点击