Меня интересует система приоритета видимости окон, которая позволяет некоторым окнам оставаться поверх других окон. Например:
когда мы используем режим «Картинка в картинке» в Chrome, мы можем заставить видеопоток накладываться поверх большинства других окон программы.
когда мы используем скрипт, например этот скрипт AutoHotKey:
^SPACE:: Winset, Alwaysontop, , Aмы можем заставить большинство программных окон оставаться наложенными поверх большинства других программных окон.Когда программа настроена на полноэкранный режим (например, игра или медиаплеер), видимость ее окна будет иметь приоритет над большинством программ.
Мне интересно понять систему, которая назначает иерархию видимости окна программы, и то, как Windows управляет этой иерархией.
Например, почему режим «Картинка в картинке» в Chrome позволяет накладывать все, кроме полноэкранной игры? Я думал, что, возможно, все полноэкранные программы имеют приоритет, однако, когда SMPlayer находится в полноэкранном режиме, режим «Картинка в картинке» в Chrome по-прежнему имеет приоритет.
Итак, мой вопрос таков; какая система используется для определения приоритетов видимости окон и как иерархия назначается каждой программе и их различным режимам?
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 | Майкрософт учиться
