Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос DXGI Desktop Duplication — скриншоты всегда черные или прозрачные

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
505
Реакции
12
Народ, кто плотно ковырял DXGI, нужна помощь. Пытаюсь реализовать систему захвата экрана через Desktop Duplication API. Пробовал писать свой хелпер, пробовал готовые либы с гитхаба (в частности, ScreenCapture) — результат один и тот же. Всё отрабатывает без ошибок, но на выходе я получаю либо абсолютно черный экран (в BGR), либо полную прозрачность (в BGRA).

Мой сеттап:
  1. Создаю D3D11 device -> DXGI device -> Desktop Duplication (через CreateDirect3DDevice и Prepare).
  2. Аллоцирую текстуру для отрисовки и текстуру для доступа CPU (staging texture).
  3. Забираю кадр через AcquireNextFrame, копирую ресурс и сразу делаю ReleaseFrame.
  4. Пытаюсь вытащить битмап и сохранить в файл.

Код:
Expand Collapse Copy
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?

Кто уже фиксил подобные приколы с пустым буфером?
 
Назад
Сверху Снизу