2014-09-05 5 views
5
эксперты

Здравствуйте Direct3D,C++ Direct3D Multiple Screen Capture

В настоящее время я занимаюсь разработкой приложений с 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(); 
} 

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

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

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

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

Дилан

Screen Scheme

+0

Что именно делает этот код в случае, если у вас есть несколько мониторов? Что именно вы хотите сделать? –

+0

Этот код делает снимок экрана моего рабочего стола, а затем я храню скриншоты в файл, где я могу воспроизвести их, поскольку это было видео. При воспроизведении скриншотов у меня есть два экрана, но это один и тот же контент (приложение дважды отображает тот же экран). Я хочу, чтобы весь расширенный экран –

+0

http://msdn.microsoft.com/en-us/library/windows/desktop/bb206364(v=vs.85).aspx – Brandon

ответ

0

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

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

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) 
}