Дублирование рабочего стола Direct3D: как восстановить разрешение экрана?

Я разрабатываю настольное приложение, которое использует интерфейс IDXGIOutputDuplication для создания снимков экрана несколько раз в секунду. Всякий раз, когда я вызываю его метод AcquireNextFrame, я проверяю, является ли возвращенный HRESULT DXGI_ERROR_ACCESS_LOST, чтобы увидеть, не делает ли какое-либо событие недействительным интерфейс дублирования. У меня также есть IDXGIFactory1, и я использую isCurrent (), чтобы увидеть, изменилось ли что-либо в настройках графики, например, был ли установлен новый графический процессор (по какой-то причине), был ли подключен новый монитор или было изменено разрешение рабочего стола.

Мой подход, когда isCurrent () возвращает false, состоит в том, чтобы восстановить ВСЕ интерфейсы IDXGI и ID3D11, используя IDXGIFactory1. Это означает, что все адаптеры, все выходы и все интерфейсы дублирования. Основываясь на журналах cout, интерфейсы для каждого монитора, кажется, восстановлены должным образом.

Моя проблема с этим подходом заключается в том, что на основе того, что я наблюдал, монитор, интерфейс OutputDuplication которого возвратил код DXGI_ERROR_ACCESS_LOST, никогда не восстанавливается, даже когда был создан новый интерфейс. Поэтому, если монитор A выдает ошибку, а позже я записываю данные с монитора B, он дает мне снимки экрана. Но если я продолжу захватывать данные с монитора А, я ничего не получу, может быть, просто коды ошибок DXGI_ERROR_ACCESS_LOST.

Я знаю, что это звучит немного странно и, возможно, неясно в некоторых частях, но пока это лучший способ, которым я могу объяснить. Я также пытался искать в Интернете, но ничего не помогло. Есть идеи?

(Также, если это поможет, я использую JNI, чтобы Java-код приложения мог получить доступ к интерфейсам C ++ Direct3D. Это проект, которым я занимаюсь на работе, и никто там не знает решения.)

1

Решение

Ладно, я еще немного покопался и нашел решение.

После реконструкции всех интерфейсов ID3D11 интерфейс дублирования рабочего стола (IDXGIOutputDuplication) по-прежнему недействителен. Возможно, потому что это было получено, в то время как разрешение экрана все еще обновлялось.

Все, что мне нужно было сделать, это снова вызвать метод IDXGIOutput1 DuplicateOutput (), когда следующий вызов AcquireNextFrame () вернет код DXGI_ERROR_ACCESS_LOST.

Поместите это здесь на тот случай, если у кого-то возникнет такая же проблема.

2

Другие решения


По вопросам рекламы [email protected]