Определить, когда окно перекрывается другим окном из того же или другого процесса

Фон

Мы запускаем наше приложение в режиме XenDesktop, и в нашем окне отображается некоторая информация в реальном времени. Но если в этом XenDekstop также запускается какое-то другое приложение, и это приложение перекрывает наше окно, то мы хотим остановить рендеринг. И как только он вышел из нашего окна, мы хотим снова начать рендеринг. К сожалению, в настоящее время подобные уведомления не поддерживаются Citrix.

Вопрос

Как мы можем определить, когда часть или все окно приложения перекрывается другими окнами, а также определить, когда это уже не так?

Я нашел WindowFromPoint Семейство функций при поиске в Google, однако, нецелесообразно для моей цели, потому что мне нужно продолжать опрашивать все координаты, которые покрывает мое окно.

Бонусные очки: Для начала достаточно, если я смогу просто определить, когда происходит такое перекрытие. Однако, если я могу точно определить, какие области моего окна покрыты / закрыты, это было бы здорово.

2

Решение

Там нет такой функции API. И обычно это не нужно. WM_PAINT заботится о себе.

Если вы получаете сообщение WM_PAINT, вы получаете регион и прямоугольник обновления области, которая требует перекраски. Но это только прямоугольник, без сложной области. Также есть регион отсечения.

Но должна быть возможность рассчитать регион самостоятельно. Если мы говорим об окне верхнего уровня.

  • Создайте прямоугольную область, состоящую из прямоугольника вашего окна
  • Пройдите все окна верхнего уровня сзади вперед
  • Игнорируйте все окна, пока не найдете окно верхнего уровня
  • Для каждого видимого окна верхнего уровня создайте прямоугольную область и присвойте ей XOR.
  • Должно быть легко с GetWindow GW_HWNDNEXT

Полученный регион — это то, что вы ищете.

Опять же: нет такой функции или сообщения, которые бы определяли, запущен или может быть выполнен, чтобы найти такое перекрытие. Нет необходимости в такой информации. Система заботится о себе с соответствующим сообщением WM_PAINT. Если область покрыта. Там нет необходимости для действий. Если область не обнаружена, WM_PAINT запускается.

3

Другие решения

Я думаю, что вы должны быть в состоянии получить такую ​​информацию при обработке WM_PAINT сообщение, так как обычно область отсечения будет установлена ​​соответственно. Звонки в RectVisible() Функция должна сказать вам, для любой части вашего окна, «должно ли оно быть нарисовано» (и так, было ли оно просто открыто).

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector