Я создаю настольное приложение Win7/8/10 x64 Direct3D11, которое позволяет пользователю переключаться между оконным и полноэкранным режимами (правильный выделенный полноэкранный режим, а не просто развернутое окно*). При настройке с двумя мониторами я сталкиваюсь с некоторыми проблемами.
Само переключение выполняется вручную с помощью IDXGISwapChain::SetFullscreenState
и работает по назначению: монитор, занимающий львиную долю площади окна (назовем его монитором А), переходит в выделенный полноэкранный режим, а другой (монитор Б) остается без изменений, позволяя пользователю нормально взаимодействовать с окнами на B, а также с полноэкранным приложением на A.
Однако, если окно на B перетаскивается или изменяется в размере так, что оно переходит в A, полноэкранное состояние приложения нарушается: иногда оно просто возвращается обратно в оконный режим (оставляя внутреннюю переменную отслеживания приложения не синхронизированной), иногда оно остается в квазиполноэкранный режим, в котором он, по-видимому, отказывается от дальнейших переключений режима и так далее. То же самое происходит, если окно, которое перекрывает окна A и B до того, как приложение перешло в полноэкранный режим, получает фокус.
Есть ли способ предотвратить это?
Я бы хотел, чтобы ОС учитывала выделенный полноэкранный режим моего приложения и поддерживала его в надежном состоянии, даже если другие окна перетаскиваются на этот монитор. Я бы хотел, чтобы поведение было похоже на наличие «всегда наверху, развернутого окна без полей» вместо него, то есть чтобы другие окна просто «исчезали за ним» и вообще не влияли на состояние моего полноэкранного окна.
Я пробовал некоторые обходные пути, такие как ответ на WM_KILLFOCUS
и временное переключение моего приложения в «максимально смешанное окно без полей», пока оно снова не получит WM_SETFOCUS
, но сообщение WM_KILLFOCUS
имеет задержку, в течение которой у пользователя есть время перетащить другое окно в область то есть все еще в полноэкранном режиме, тем самым возвращая меня к исходной точке.
* Причина, по которой мне нужна эта функция, а не просто использование развернутого окна без полей (которое также является поддерживаемым режимом, кстати), связана с тем, что она позволяет значительно снизить задержку от движения мыши до рендеринга, управление вертикальной синхронизацией (ВКЛ / ВЫКЛ) и т. д.. короче говоря, все это важно для характера этого приложения (которое не является игрой).