使用DirectX截屏


//奇慢无比

//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
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值