Снимок экрана C ++ DirectX получает черное изображение - PullRequest
1 голос
/ 16 июля 2011

Я пытаюсь сделать снимок экрана с помощью DirectX. Я попробовал код с нескольких страниц, который объясняет, как, но всегда получаю черный снимок экрана. Если кто-то может мне помочь, я буду благодарен.

мой код:

int _tmain(int argc, _TCHAR* argv[])
{
    IDirect3DDevice9* g_pd3dDevice;
    //SaveScreenShot("test.bmp",D3DXIFF_BMP);   
    IDirect3DSurface9* pSurface=NULL;
    //IDirect3DSurface9* pSource=NULL;
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = FALSE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
    d3dpp.BackBufferCount = 1;
    d3dpp.BackBufferWidth = 1280;
    d3dpp.BackBufferHeight = 1024;
    d3dpp.hDeviceWindow = GetDesktopWindow();
    d3dpp.FullScreen_RefreshRateInHz=0;
    d3dpp.MultiSampleQuality=0;
    IDirect3D9* direct=Direct3DCreate9(D3D9b_SDK_VERSION);
    direct->CreateDevice(D3DADAPTER_DEFAULT,
                         D3DDEVTYPE_HAL,
                         GetDesktopWindow(),
                         D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                         &d3dpp,&g_pd3dDevice);


    //g_pd3dDevice->GetRenderTarget(0,&pSource);
    g_pd3dDevice->CreateOffscreenPlainSurface(1280, 1024,
        D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &pSurface, NULL);
    g_pd3dDevice->GetFrontBufferData(0, pSurface);
    /*g_pd3dDevice->GetRenderTargetData(pSource,pSurface);
    g_pd3dDevice->GetRenderTargetData(pSource,pSurface);*/
    D3DXSaveSurfaceToFile("Desktop.jpg",D3DXIFF_JPG,pSurface,NULL,NULL);
    pSurface->Release();
    //pSource->Release();
    return 0;
}

Ответы [ 2 ]

5 голосов
/ 16 июля 2011

Попробуйте добавить некоторую обработку ошибок, и, возможно, вы узнаете, почему она не работает.

1 голос
/ 18 июля 2011

Я думаю, что код показывает черный скриншот, потому что вы пытаетесь сохранить передний буфер, который в момент вызова D3DXSaveSurfaceToFile () пуст. Сначала вы должны либо вызвать IDirect3dDevice9 :: Present (), либо сделать следующее:

  • Нарисуйте все, что вы хотите в заднем буфере устройства
  • Получить дескриптор постоянного тока заднего буфера (источник)
  • Используйте GDI, вызывая BitBlt, чтобы скопировать содержимое исходного DC на DC назначения, который затем можно записать в файл, распечатать и т. Д.

Direct3D не выдаст вам содержимое того, что вы видите на экране (по крайней мере, по моему опыту!), Только содержимое клиентской области окна, для которого оно было создано.

...