C ++ Direct3D Захват нескольких экранов

Привет эксперты Direct3D,

В настоящее время я разрабатываю приложение с Direct3D для захвата рабочего стола двух моих мониторов (конечно, в качестве расширенного рабочего стола).
Следующий код работает хорошо, но я просто могу захватить основной экран, а не расширенный рабочий стол (только один экран захватывается дважды)

Как я могу адаптировать это решение для двойного захвата экрана?

Прежде всего, я инициализирую Direct3D:

D3DDISPLAYMODE          d3dDisplayMode;
D3DPRESENT_PARAMETERS   d3dPresentationParameters; //Presentation parameters (backbufferwidth, height...)

if( (pSinfo->g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)) == NULL )
return FALSE;

if( pSinfo->g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3dDisplayMode) ==  D3DERR_INVALIDCALL )
return FALSE;

ZeroMemory(&d3dPresentationParameters,sizeof(D3DPRESENT_PARAMETERS));
d3dPresentationParameters.Windowed = TRUE;
d3dPresentationParameters.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
d3dPresentationParameters.BackBufferFormat = d3dDisplayMode.Format;
d3dPresentationParameters.BackBufferHeight = gScreenRect.bottom = d3dDisplayMode.Height;
d3dPresentationParameters.BackBufferWidth = gScreenRect.right = d3dDisplayMode.Width;
d3dPresentationParameters.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dPresentationParameters.SwapEffect= D3DSWAPEFFECT_DISCARD;
d3dPresentationParameters.hDeviceWindow = hWnd;
d3dPresentationParameters.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
d3dPresentationParameters.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;

pSinfo->uiWidth = d3dDisplayMode.Width;
pSinfo->uiHeight = d3dDisplayMode.Height;

if( pSinfo->g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING ,&d3dPresentationParameters,&pSinfo->g_pd3dDevice) != D3D_OK )
return FALSE;

И затем цикл, который выполняет непрерывные снимки экрана и сохраняет данные изображения в pData:

while(1)
{
pSinfo->g_pd3dDevice->GetRenderTarget(0, &pSinfo->pRenderSurface);
pSinfo->g_pd3dDevice->CreateOffscreenPlainSurface(pSinfo->uiWidth, pSinfo->uiHeight, pSinfo->d3dFormat, D3DPOOL_SYSTEMMEM, &pSinfo->pRenderSurface, NULL);
pSinfo->g_pd3dDevice->GetFrontBufferData(0, pSinfo->pRenderSurface);

//D3DXSaveSurfaceToFile("Desktop.bmp", D3DXIFF_BMP, pSinfo->pRenderSurface,NULL, NULL); //Test

ZeroMemory(&pSinfo->lockedRect, sizeof(D3DLOCKED_RECT));
pSinfo->pRenderSurface->LockRect(&pSinfo->lockedRect,NULL, D3DLOCK_READONLY);

memcpy((BYTE*)pSinfo->pData, (BYTE*)pSinfo->lockedRect.pBits, (pSinfo->uiWidth) * pSinfo->uiHeight * pSinfo->uiBitsPerPixels/8);

pSinfo->pRenderSurface->UnlockRect();
//InvalidateRect(((CMainFrame*)(pApp->m_pMainWnd))->m_hWnd,NULL,false);
pSinfo->pRenderSurface->Release();
}

Для большей ясности о проблеме и решении:

У меня есть два монитора с моим расширенным рабочим столом Windows. при захвате экрана у меня есть два скриншота с основным экраном, и мне нужен один скриншот основного экрана и еще один с расширенным экраном.

Я предполагаю, что должен где-то установить параметр, указывающий, что расширенный рабочий стол начинается с Point.x = 1920 (для экрана 1080p), но я просто не знаю как.

Спасибо большое за вашу помощь !

Dylan

Схема экрана

5

Решение

Хорошо, я нашел проблему прямо сейчас.

Важно отметить создание устройства с:

pSinfo->g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING ,&d3dPresentationParameters,&pSinfo->g_pd3dDevice) != D3D_OK )

Здесь я создавал устройство с D3DADAPTER_DEFAULT, которое не заботится о других дисплеях. Поэтому я адаптировал этот код в зависимости от количества доступных экранов:

for (i = 0; i < NUMBER_OF_DISPLAYS; i++)
{
pSinfo->g_pD3D->CreateDevice(i,D3DDEVTYPE_REF,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING ,&d3dPresentationParameters,&pSinfo->g_pd3dDevice) != D3D_OK )
}
1

Другие решения


По вопросам рекламы [email protected]