2014-09-05 23 views
5
chuyên gia

Xin chào Direct3D,C++ Direct3D Nhiều Screen Capture

Tôi hiện đang phát triển một ứng dụng với Direct3D để chụp màn hình hai màn hình của tôi (được sử dụng như máy tính để bàn mở rộng tất nhiên). Mã sau hoạt động tốt nhưng tôi chỉ có thể chụp màn hình chính chứ không phải màn hình mở rộng (chỉ một màn hình được chụp hai lần)

Làm cách nào để tôi có thể điều chỉnh giải pháp này?

Trước hết, tôi khởi tạo 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; 

Và sau đó, vòng lặp mà thực hiện chụp màn hình liên tục và lưu dữ liệu hình ảnh trong 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(); 
} 

Để làm rõ hơn về vấn đề này tôi có và giải pháp:

Tôi có hai màn hình với máy tính để bàn cửa sổ mở rộng của mình. khi chụp màn hình, tôi có hai ảnh chụp màn hình với màn hình chính và những gì tôi muốn là một ảnh chụp màn hình của màn hình chính và một màn hình khác với màn hình mở rộng.

Tôi đoán tôi phải thiết lập thông số ở đâu đó cho biết rằng màn hình mở rộng bắt đầu tại Point.x = 1920 (đối với màn hình 1080p) nhưng tôi không biết cách thực hiện.

Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn!

Dylan

Screen Scheme

+0

Mã này chính xác trong trường hợp bạn có nhiều màn hình? Chính xác thì bạn muốn nó làm gì? –

+0

Mã này làm cho ảnh chụp màn hình của máy tính để bàn của tôi và sau đó tôi lưu trữ ảnh chụp màn hình vào một tệp nơi tôi có thể phát lại chúng vì đó là video. Khi phát lại các ảnh chụp màn hình, tôi có hai màn hình của tôi nhưng nó là cùng một nội dung (Ứng dụng hiển thị cùng một màn hình hai lần). Những gì tôi muốn là có toàn bộ màn hình mở rộng –

+0

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

Trả lời

0

Được rồi, tôi đã tìm thấy vấn đề ngay bây giờ.

Điều quan trọng cần chú ý là tạo thiết bị với:

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

Ở đây tôi đã tạo ra một thiết bị với D3DADAPTER_DEFAULT mà không chăm sóc màn hình khác. Do đó, tôi đã điều chỉnh mã này tùy thuộc vào số lượng màn hình có sẵn:

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