Понимание приоритетов видимости окна

Меня интересует система приоритета видимости окон, которая позволяет некоторым окнам оставаться поверх других окон. Например:

  • когда мы используем режим «Картинка в картинке» в Chrome, мы можем заставить видеопоток накладываться поверх большинства других окон программы.

  • когда мы используем скрипт, например этот скрипт AutoHotKey: ^SPACE:: Winset, Alwaysontop, , A мы можем заставить большинство программных окон оставаться наложенными поверх большинства других программных окон.

  • Когда программа настроена на полноэкранный режим (например, игра или медиаплеер), видимость ее окна будет иметь приоритет над большинством программ.

Мне интересно понять систему, которая назначает иерархию видимости окна программы, и то, как Windows управляет этой иерархией.

Например, почему режим «Картинка в картинке» в Chrome позволяет накладывать все, кроме полноэкранной игры? Я думал, что, возможно, все полноэкранные программы имеют приоритет, однако, когда SMPlayer находится в полноэкранном режиме, режим «Картинка в картинке» в Chrome по-прежнему имеет приоритет.

Итак, мой вопрос таков; какая система используется для определения приоритетов видимости окон и как иерархия назначается каждой программе и их различным режимам?

1 ответ
1

Какая система используется для определения приоритета видимости окна

У Windows есть Z-порядок, который устанавливается при их создании:

Z-порядок окна указывает положение окна в стеке перекрывающихся окон. Этот стек окон ориентирован вдоль воображаемой оси Z, идущей наружу от экрана. Окно в верхней части z-порядка перекрывает все остальные окна. Окно в нижней части z-порядка перекрывается всеми другими окнами.

Система поддерживает z-порядок в одном списке. Он добавляет окна в z-порядок в зависимости от того, являются ли они самыми верхними окнами, окнами верхнего уровня или дочерними окнами. Самое верхнее окно перекрывает все другие не самые верхние окна, независимо от того, является ли оно активным или окном переднего плана. Самое верхнее окно имеет WS_EX_TOPMOST стиль. Все самые верхние окна появляются в z-порядке перед любыми не самыми верхними окнами. Дочернее окно группируется со своим родителем в z-порядке.

Когда приложение создает окно, система помещает его вверху z-порядка для окон того же типа. Вы можете использовать
BringWindowToTop функция, чтобы вывести окно в начало z-порядка для окон одного и того же типа. Вы можете изменить z-порядок с помощью SetWindowPos и DeferWindowPos функции.

Пользователь изменяет z-порядок, активируя другое окно. Система размещает активное окно вверху z-порядка для окон того же типа. Когда окно оказывается на вершине z-порядка, то же самое происходит и с его дочерними окнами. Вы можете использовать GetTopWindow функция для поиска во всех дочерних окнах родительского окна и возврата дескриптора дочернего окна, которое является самым высоким в z-порядке. GetNextWindow функция извлекает дескриптор следующего или предыдущего окна в z-порядке.

Источник: Функции окна — приложения Win32 | Майкрософт учиться

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *