- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 505
- Реакции
- 12
Народ, кто плотно ковырял DXGI, нужна помощь. Пытаюсь реализовать систему захвата экрана через Desktop Duplication API. Пробовал писать свой хелпер, пробовал готовые либы с гитхаба (в частности, ScreenCapture) — результат один и тот же. Всё отрабатывает без ошибок, но на выходе я получаю либо абсолютно черный экран (в BGR), либо полную прозрачность (в BGRA).
Мой сеттап:
Что странно: AcquireNextFrame стабильно возвращает S_OK, указатель на данные валидный, формат DXGI_FORMAT_B8G8R8A8_UNORM соблюден. Но буфер пустой. Я уже грешил на защиту контента (DRM) или оверлеи, но даже на чистом рабочем столе та же история.
Что уже проверял:
Есть подозрение, что проблема в Map/Unmap или в том, как именно данные перетекают из видеопамяти в системную. Возможно, я упускаю какой-то флаг при создании D3D11_TEXTURE2D_DESC для staging текстуры.
Кто сталкивался с подобным поведением DXGI на Windows 10/11?
Кто уже фиксил подобные приколы с пустым буфером?
Мой сеттап:
- Создаю D3D11 device -> DXGI device -> Desktop Duplication (через CreateDirect3DDevice и Prepare).
- Аллоцирую текстуру для отрисовки и текстуру для доступа CPU (staging texture).
- Забираю кадр через AcquireNextFrame, копирую ресурс и сразу делаю ReleaseFrame.
- Пытаюсь вытащить битмап и сохранить в файл.
Код:
BYTE* GetFrameAsBitmap(CAPTURE& capturer, int& width, int& height) {
DXGI_OUTDUPL_FRAME_INFO frameInfo;
CComPtr<IDXGIResource> desktopResource;
HRESULT hr = capturer.lDeskDupl->AcquireNextFrame(0, &frameInfo, &desktopResource);
if (SUCCEEDED(hr)) {
if (!capturer.Get(desktopResource, false)) {
capturer.lDeskDupl->ReleaseFrame();
return nullptr;
}
capturer.lDeskDupl->ReleaseFrame();
}
width = capturer.lOutputDuplDesc.ModeDesc.Width;
height = capturer.lOutputDuplDesc.ModeDesc.Height;
return capturer.buf.data();
}
Что странно: AcquireNextFrame стабильно возвращает S_OK, указатель на данные валидный, формат DXGI_FORMAT_B8G8R8A8_UNORM соблюден. Но буфер пустой. Я уже грешил на защиту контента (DRM) или оверлеи, но даже на чистом рабочем столе та же история.
Что уже проверял:
- Инициализация API проходит успешно.
- Размеры кадра определяются верно (1920x1080).
- Поинтер на битмап не нулевой.
Есть подозрение, что проблема в Map/Unmap или в том, как именно данные перетекают из видеопамяти в системную. Возможно, я упускаю какой-то флаг при создании D3D11_TEXTURE2D_DESC для staging текстуры.
Кто сталкивался с подобным поведением DXGI на Windows 10/11?
Кто уже фиксил подобные приколы с пустым буфером?