Я использую 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.