Снимок экрана C++ DirectX получает черное изображение

Я пытаюсь сделать снимок экрана с 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 ответа

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

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

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

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

Другие вопросы по тегам