win7下实现截屏

.h头文件
//DX
IDirect3D9* mv_pD3D;
IDirect3DDevice9* mv_pd3dDevice;
IDirect3DSurface9* mv_pSurface;
RECT mv_screenRect;
bool mv_bCapturing;
LPVOID mv_pBits;
HDC mv_hBackDC;
HBITMAP mv_hBackBitmap;
HBITMAP mv_hOldBitmap;
NOTIFYICONDATA mv_nid;
int mv_nDisplayWidth;
int mv_nDisplayHeight;


.cpp文件的函数实现
DX
BOOL CBmpManager::InitDX()
{
///初始化变量
mv_pD3D=NULL;
mv_pd3dDevice=NULL;
mv_pSurface=NULL;
mv_screenRect.left=0;
mv_screenRect.right=0;
mv_screenRect.top=0;
mv_screenRect.bottom=0;
mv_bCapturing=false;
mv_pBits=NULL;
mv_hBackDC=NULL;
mv_hBackBitmap=NULL;
mv_hOldBitmap=NULL;

///
if(FAILED(InitD3D(NULL))){
AfxMessageBox(_T("Failed to InitD3D!"));
return FALSE;
}
return TRUE;
}

HRESULT CBmpManager::InitD3D(HWND hWnd)
{
D3DDISPLAYMODE ddm;
D3DPRESENT_PARAMETERS d3dpp;

if((mv_pD3D=Direct3DCreate9(D3D_SDK_VERSION))==NULL)
{
AfxMessageBox(_T("Unable to Create Direct3D "));
return E_FAIL;
}

if(FAILED(mv_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&ddm)))
{
AfxMessageBox(_T("Unable to Get Adapter Display Mode"));
return E_FAIL;
}

//
ddm.Height=ddm.Height;
ddm.Width=ddm.Width;
//
ZeroMemory(&d3dpp,sizeof(D3DPRESENT_PARAMETERS));

d3dpp.Windowed=WINDOW_MODE;
d3dpp.Flags=D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
d3dpp.BackBufferFormat=ddm.Format;
d3dpp.BackBufferHeight=mv_nDisplayHeight=mv_screenRect.bottom =ddm.Height;
d3dpp.BackBufferWidth=mv_nDisplayWidth=mv_screenRect.right =ddm.Width;
d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow=hWnd;
d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT;
d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;

if(FAILED(mv_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING ,&d3dpp,&mv_pd3dDevice)))
{
AfxMessageBox(_T("Unable to Create Device"));
return E_FAIL;
}

if(FAILED(mv_pd3dDevice->CreateOffscreenPlainSurface(ddm.Width, ddm.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &mv_pSurface, NULL)))
{
AfxMessageBox(_T("Unable to Create Surface"));
return E_FAIL;
}

return S_OK;
}


LPD3DXBUFFER CBmpManager::GetBmpFromRectDX(CRect cRect)
{
//HBITMAP hBitmap;
static int i=0;
//
LARGE_INTEGER m_liPerfFreq={0};
//获取每秒多少CPU Performance Tick 
QueryPerformanceFrequency(&m_liPerfFreq);
//
LPD3DXBUFFER lpD3DBuf;
mv_pd3dDevice->GetFrontBufferData(0, mv_pSurface);

LARGE_INTEGER liPerfStart={0};
QueryPerformanceCounter(&liPerfStart);
/

RECT rect;
rect.left=cRect.left;
rect.top=cRect.top;
rect.bottom=cRect.bottom;
rect.right=cRect.right;

CString szFileName;
szFileName.Format(_T("hooksBmp/ScreenShot%d.jpg"),i++);
// D3DXSaveSurfaceToFile(szFileName,D3DXIFF_JPG,mv_pSurface,NULL,&rect);
D3DXSaveSurfaceToFileInMemory(&lpD3DBuf,
D3DXIFF_BMP,mv_pSurface,NULL,&rect);

/
LARGE_INTEGER liPerfEnd={0};
QueryPerformanceCounter(&liPerfEnd);

int time=(int)(((liPerfEnd.QuadPart - 
liPerfStart.QuadPart) * 1000)/m_liPerfFreq.QuadPart);

return lpD3DBuf;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值