使用DirectX截屏

原文链接: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值