DirectX захват полноэкранного приложения - PullRequest
0 голосов
/ 09 мая 2018

У меня проблема с захватом экрана из полноэкранного приложения (игры). Я сделал код для захвата экрана на основе кода из этих ссылок:

Захват экрана с использованием DirectX

Частичный снимок экрана DirectX

Но это работает только при использовании где-то на рабочем столе, а не в полноэкранном приложении. Пытался изменить "parameters.Windowed" на false, не работал, пробовал некоторые опции в функции createdevice, но когда во весь экран не может создать устройство (остается нулевым, возвращается hr 0x88760868).

Код:

void get_screen()
{
    UINT adapter = D3DADAPTER_DEFAULT;
    IDirect3D9 *d3d = nullptr;
    IDirect3DDevice9 *device = nullptr;
    IDirect3DSurface9 *surface = nullptr;
    D3DPRESENT_PARAMETERS parameters = { 0 };
    D3DDISPLAYMODE mode;  //screen resolution
    D3DLOCKED_RECT rc;
    UINT pitch;
    SYSTEMTIME st;
    LPBYTE shots = nullptr;
    HRESULT hr;

    // init D3D and get screen size
    d3d = Direct3DCreate9(D3D_SDK_VERSION);
    d3d->GetAdapterDisplayMode(adapter, &mode);

    parameters.Windowed = TRUE;
    parameters.BackBufferFormat = D3DFMT_A8R8G8B8;
    parameters.BackBufferHeight = mode.Height;
    parameters.BackBufferWidth = mode.Width;
    parameters.SwapEffect = D3DSWAPEFFECT_DISCARD;

    // create device & capture surface
    d3d->CreateDevice(adapter, D3DDEVTYPE_HAL, NULL, D3DCREATE_HARDWARE_VERTEXPROCESSING, &parameters, &device);
    device->CreateOffscreenPlainSurface(mode.Width, mode.Height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &surface, nullptr);

    // get the data
    device->GetFrontBufferData(0, surface);
    surface->LockRect(&rc, NULL, 0);
    pitch = rc.Pitch;
    shots = new BYTE[pitch * mode.Height];
    CopyMemory(shots, rc.pBits, rc.Pitch * mode.Height);
    surface->UnlockRect();

    // save all screenshots
    WCHAR file[100] = L"test.png";
    save_screen(mode.Width, mode.Height, pitch, shots, file, GUID_ContainerFormatPng);

    //cleanup:
    surface->Release();
    device->Release();
    d3d->Release();
}
...