#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, поскольку изображение находится не в системной памяти, а в памяти графического процессора.
В этом случае вам необходимо перенести это изображение из памяти графического процессора в системную память.
Итак, как это сделать?
- Создайте дескриптор для
ID3D11Texture2D
типаD3D11_TEXTURE12D_DESC
of . - Используйте
GetDesc
для изображения(ID3D11Texture2D
), которое вы приобрели с помощьюIDXGIOutputDuplication::AcquireNextFrame
, чтобы заполнить дескриптор. - Этот дескриптор, который вы получаете, имеет
frameDescriptor.Usage
значениеD3D11_USAGE_DEFAULT
. - Вам нужно установить дескриптор со следующими параметрами (пусть другие останутся как есть):
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;
- Теперь создайте новый промежуточный буфер (
ID3D11Texture2D
), используя приведенный выше дескриптор следующим образом:m_Device->CreateTexture2D(amp;frameDescriptor, NULL, amp;newId3d11Texture2D);
- Скопируйте содержимое полученного изображения в промежуточный буфер следующим образом:
m_DeviceContext->CopyResource(newId3d11Texture2D, m_AcquiredDesktopImage);
- Важно: освободите полученный фрейм с помощью
IDXGIOutputDuplication::ReleaseFrame()
- Теперь вы можете обрабатывать эту newTexture (
newId3d11Texture2D
) по своему усмотрению!!!!!
Сопоставьте его, если хотите…
Этого должно быть достаточно для ответа на ваш запрос … если вам нужна дополнительная информация, вы всегда можете проверить страницы msdn или задать вопрос в комментариях…