Как я могу предотвратить отображение моего пользовательского кода всплывающей подсказки, когда эта часть моего окна закрыта всегда верхним окном? - PullRequest
2 голосов
/ 01 октября 2009

Мы реализовали некоторый пользовательский код рисования всплывающей подсказки, который запускает события Tick таймера. Всякий раз, когда происходит это событие, мы проверяем, чтобы наш элемент управления был видимым (this.Visible) и являлся окном переднего плана (GetForegroundWindow()).

Проблема, с которой мы сталкиваемся, связана с окнами «всегда сверху», такими как «Диспетчер задач» или «Обозреватель процессов» (когда включена опция «всегда сверху»). Поскольку эти окна всегда находятся сверху, иногда наше приложение закрывается / закрывается такими окнами, но наша всплывающая подсказка по-прежнему всплывает и отображается поверх верхнего окна.

Я пытался использовать свойство Form.TopMost, но это недопустимо, потому что в этом случае всплывающие подсказки никогда не появляются, если где-либо есть окно "всегда сверху". В этом случае наше приложение даже активно, поэтому мы должны показывать всплывающие подсказки.

Как мне определить / определить, есть ли окно "всегда сверху", покрывающее область в моей форме, где находится мышь? Я хочу предотвратить отображение всплывающей подсказки в окне.

1 Ответ

3 голосов
/ 01 октября 2009

Звучит так, будто вы опрашиваете положение мыши с помощью таймера, а затем отображаете подсказку. Это неправильный путь. Что вы должны сделать, это обнаружить сообщения о перемещении мыши. Если вы получаете события перемещения мыши, сообщающие, что мышь находится в определенной области, установите таймер, и, если мышь не покинула эту область к моменту запуска таймера, отобразите подсказку. (Кстати, именно так работают родные подсказки Windows. См. TrackMouseEvent.)

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

Если вы используете текущую технику, вы можете использовать функцию API WindowFromPoint, чтобы определить, какое окно видно в любой заданной точке экрана. Используйте это, чтобы определить, находится ли ваше окно сверху в том месте, где вы планируете отображать подсказку. (Карта .Net Framework API говорит, что .Net эквивалентна этой функции API: Form.GetChildAtPoint, но это дает только дочерние элементы формы .Net, тогда как вам нужно учитывать все окна верхнего уровня, в том числе не .Net windows.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...