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

Фон

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

Вопрос

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

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

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

3 ответа

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

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

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

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

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

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

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

Несмотря на то, что это не решение проблемы OP, я хочу отметить, что как только перекрывающееся окно открывает часть вашего окна (а также если вы перетащите большую часть окна обратно на экран), вы получите сообщение WM_ERASEBKGND перед WM_PAINT.

Другие вопросы по тегам