Почему IDXGISwapChain :: SetFullscreenState не может работать в полноэкранном режиме? - PullRequest
1 голос
/ 07 марта 2012

Я использую DX11 в игре и хочу иметь возможность надежно запускать игру в полноэкранном режиме. Это означает, что я могу пойти одним из двух способов: указать полноэкранный режим в описании цепочки подкачки или запустить в окне и сразу переключиться в полноэкранный режим. Согласно MSDN (http://msdn.microsoft.com/en-us/library/windows/desktop/bb174537(v=vs.85).aspx), вы должны создать цепочку обмена в оконном режиме, а затем переключиться в полноэкранный режим, если хотите запустить в полноэкранном режиме, что я и делаю.

Проблема заключается в следующем: когда я звоню IDXGISwapChain::SetFullscreenState(TRUE, NULL), вызов завершается неудачно и возвращает код ошибки DXGI_ERROR_NOT_CURRENTLY_AVAILABLE . Согласно MSDN, причины этого могут быть следующими:

  • Приложение работает через сервер терминалов.
  • Окно вывода закрыто.
  • В окне вывода отсутствует фокус клавиатуры.
  • Другое приложение уже находится в полноэкранном режиме.

Первый случай не соответствует действительности. Я использую Visual Studio 2010 с удаленным отладчиком, поэтому, если удаленный отладчик не использует Terminal Server, у меня все в порядке. Второй случай тоже не соответствует действительности; никаких других окон на рабочем столе нет. Четвертый случай также не соответствует действительности; опять же, никаких других окон на рабочем столе нет.

Это оставляет третий вариант. Фокус клавиатуры. Исходя из того, что я собрал в Интернете, я создал этот код для фокусировки клавиатуры перед созданием графического устройства DX11.

HWND _returnValue = SetFocus(m_hWnd);
if(_returnValue == NULL) {
    PrintWarning("Unable to get keyboard focus on app activation.\n");
}

Этот вызов успешен, но я все еще не выхожу на весь экран. Я также не смог найти альтернативу этому. Тем не менее, я знаю, что можно надежно украсть фокус клавиатуры, так как я вижу, что Windows делает это все время, и я видел другие приложения, которые делают это.

Итак, мой вопрос таков: как я могу надежно работать в полноэкранном режиме? или Как я могу надежно сфокусировать клавиатуру для моего приложения?

РЕДАКТИРОВАТЬ: Прочитав это несколько раз, я понял, что пропустил некоторую ключевую информацию. Приложение всегда запускается правильно в полноэкранном режиме, если я использую .exe напрямую, дважды щелкнув по нему или поместив его в меню автозагрузки на целевой машине (хотя сообщения брандмауэра Windows по-прежнему не позволяют перейти в полноэкранный режим, но я не нужно чтобы работал). Единственная проблема - когда приложение запускается другим приложением или если оно запускается с помощью удаленного отладчика Visual Studio.

Ответы [ 2 ]

1 голос
/ 13 апреля 2012

Кажется вероятным, что отладчик или какое-то другое приложение крадет фокус, или сторожевой таймер вас догоняет.

См. «Отладка в полноэкранном режиме» в Обзоре DXGI в MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/bb205075(v=vs.85).aspx#Debugging

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

0 голосов
/ 15 февраля 2017

Для меня, решение проблемы с отображением экрана «дублировать», а не «расширять».Я не уверен, в чем была основная причина, поскольку у меня было полноэкранное ... э-э ... "приложение визуализации", открытое в режиме расширенного отображения, при работе в Visual Studio на консольном приложении без проблем, пока я не запустилв эту ситуацию.Поэтому попробуйте изменить отображение с «расширить» на «дублировать».

...