пятница, 13 мая 2016 г.

Скриншот экрана с помощью DirectX

Сделать скриншот экрана с помощью DirectX достаточно просто, следующий код на C++ демонстрирует, как сделать скриншот экрана.


#include <d3d9.h>
#include <D3dx9tex.h>
#pragma comment (lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")


IDirect3DSurface9 * g_pSurface =  NULL;
LPDIRECT3DDEVICE9   g_pDevice = NULL;
LPDIRECT3D9 g_pD3D = NULL;

BOOL InitDInterface()
   //Инициализация DirectX
   if( NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
return FALSE;

//Получаем параметры Width & Height для экрана
   D3DDISPLAYMODE D3DMode = {0};
   if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &D3DMode)))
   {
ReleaseDInterface();
  return FALSE;
   }
//Заполняем структуру, 
   D3DPRESENT_PARAMETERS D3DParameters;
   ZeroMemory(&D3DParameters, sizeof(D3DPRESENT_PARAMETERS));

   D3DParameters.BackBufferWidth  = D3DMode.Width;
   D3DParameters.BackBufferHeight = D3DMode.Height;
   D3DParameters.Windowed = TRUE;
   D3DParameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
   D3DParameters.BackBufferFormat = D3DMode.Format;

//Создаем устройство
    if(FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow(),
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &D3DParameters, &g_pDevice )))
    {
ReleaseDInterface();
   return FALSE;
}

//Подготовка к захвату
if(FAILED(g_pDevice->CreateOffscreenPlainSurface(D3DMode.Width, 
D3DMode.Height, 
D3DFMT_A8R8G8B8, 
D3DPOOL_SCRATCH, 
&g_pSurface, NULL)))
{
ReleaseDInterface();
   return FALSE;

}

//Сам захват.
    if(FAILED(g_pDevice->GetFrontBufferData(0, g_pSurface)))
{
  ReleaseDInterface();
return FALSE;
}
 
     //Сохраняем на диске
D3DXSaveSurfaceToFileA("test.bmp", D3DXIFF_BMP, g_pSurface, NULL, NULL);


return TRUE;
}

VOID ReleaseDInterface()
{
if(g_pD3D != NULL)
g_pD3D->Release();

if(g_pDevice != NULL)
g_pDevice->Release();

if(g_pSurface != NULL)
g_pSurface->Release();

g_pD3D     = NULL;
g_pDevice  = NULL;
g_pSurface = NULL;
}

P.S Необходимо скачать DirectX SDK с сайта MSDN и настроить пути к библиотекам и заголовочным файлам в проекте.

Комментариев нет:

Отправить комментарий