DesktopImageInSystemПамять DXGI_OUTDUPL_DESC

#c #windows #screen-scraping #directx-11

#c #Windows #очистка экрана #directx-11

Вопрос:

Мне нужно, чтобы эта переменная была TRUE, чтобы я мог использовать MapDesktopSurface из IDXGIOutputDuplication

Как нам установить для этого значение true. Какие предыдущие настройки можно выполнить.

Вот ссылка

http://msdn.microsoft.com/en-us/library/windows/desktop/hh404622 (v= против 85).aspx

Комментарии:

1. …приложение должно сначала перенести изображение на промежуточную поверхность, а затем заблокировать изображение, вызвав метод IDXGISurface::Map

2. Хорошо, это то, о чем я беспокоился. Я пытался пропустить этот этап при создании временной поверхности.

Ответ №1:

Я столкнулся с тем же problem…So это то, что вам нужно сделать:

Метод MapDesktopSurface в большинстве случаев возвращает DXGI_ERROR_UNSUPPORTED, поскольку изображение находится не в системной памяти, а в памяти графического процессора.

В этом случае вам необходимо перенести это изображение из памяти графического процессора в системную память.

Итак, как это сделать?

  1. Создайте дескриптор для ID3D11Texture2D типа D3D11_TEXTURE12D_DESC of .
  2. Используйте GetDesc для изображения( ID3D11Texture2D ), которое вы приобрели с помощью IDXGIOutputDuplication::AcquireNextFrame , чтобы заполнить дескриптор.
  3. Этот дескриптор, который вы получаете, имеет frameDescriptor.Usage значение D3D11_USAGE_DEFAULT .
  4. Вам нужно установить дескриптор со следующими параметрами (пусть другие останутся как есть):
     frameDescriptor.Usage = D3D11_USAGE_STAGING;
    frameDescriptor.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
    frameDescriptor.BindFlags = 0;
    frameDescriptor.MiscFlags = 0;
    frameDescriptor.MipLevels = 1;
    frameDescriptor.ArraySize = 1;
    frameDescriptor.SampleDesc.Count = 1;
     
  5. Теперь создайте новый промежуточный буфер ( ID3D11Texture2D ), используя приведенный выше дескриптор следующим образом:
     m_Device->CreateTexture2D(amp;frameDescriptor, NULL, amp;newId3d11Texture2D);
     
  6. Скопируйте содержимое полученного изображения в промежуточный буфер следующим образом:
     m_DeviceContext->CopyResource(newId3d11Texture2D, m_AcquiredDesktopImage);
     
  7. Важно: освободите полученный фрейм с помощью IDXGIOutputDuplication::ReleaseFrame()
  8. Теперь вы можете обрабатывать эту newTexture ( newId3d11Texture2D ) по своему усмотрению!!!!!

Сопоставьте его, если хотите…

Этого должно быть достаточно для ответа на ваш запрос … если вам нужна дополнительная информация, вы всегда можете проверить страницы msdn или задать вопрос в комментариях…