Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать: окно поверх других или нет, если есть хендел? [D6, D7, WinXP]


lox ©   (2005-08-16 18:23:00) 

Как узнать: окно поверх других или нет, если есть хендел?
Помогите плиз.


Юрий Зотов   (2005-08-17 18:57:00) [1]

> lox   (17.08.05 18:14) [13]

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


lox   (2005-08-17 18:14:00) [2]

Спасибо всем! Я воспользовался советом Игоря Шевченко.


Юрий Зотов   (2005-08-17 16:16:00) [3]

http://www.delphimaster.ru/cgi-bin/forum.pl?n=5&id=1124275353

Постинг [3]. Идем от своего окна наверх по Z-порядку и проверяем IntersectRect. Просто, элегантно, надежно.


lox   (2005-08-17 11:16:00) [4]

Думкин
Точнее не какое-то а активное окно(не моё)


Игорь Шевченко   (2005-08-17 10:15:00) [5]


> Как узнать: окно поверх других или нет, если есть хендел?


(GetWindowLong (Handle, GWL_EXSTYLE) and WS_EX_TOPMOST) <> 0


Думкин   (2005-08-17 09:07:00) [6]

Так.... какое-то? Не обязательно ваше? ответ дан. Читаем ветку.


lox   (2005-08-17 08:53:00) [7]

А если я имел ввиду WS_EX_TOPMOST, то как можно сделать?
Опишу поподробнее: моя прога 5-10 пикселей висит ссамого верху экрана, когда на неё наводишь курсор вылетает меню. Трабла в том что моя прога висит выше всех приложений(даже игр и плееров), так вот надо сделать так чтобы когда открыт плеер или игра придать моему окну свойство нормальное.
Я почти всё реализовл, но надо определить что какоето окно имеет свойство "поверх всех"


Eraser   (2005-08-16 20:23:00) [8]

Юрий Зотов ©   (16.08.05 20:13) [5]
Иначе вопрос решался бы вообще элементарно, в 1 строку:


Так и то верно!
А может автор вообще имел ввиду "Имеет ли окно флаг WS_EX_TOPMOST"...
В общем случае подойдёт GetForegroundWindow думаю...


Юрий Зотов   (2005-08-16 20:23:00) [9]

> lox   (16.08.05 20:01) [3]

Если окно такое маленькое, то вызов GetWindowRect, а потом 4 вызова GetWindowFromPoint (для каждого угла) решают задачу с вероятностью примерно пять девяток.


Юрий Зотов   (2005-08-16 20:13:00) [10]

> Eraser ©   (16.08.05 20:05) [4]

GetWindow/GetNextWindow - это было первое, о чем я подумал. Но в данном случае это решение не прокатывает, потому что окно может быть и не первым в Z-порядке, но, тем не менее, будет полностью видимым (то есть, не закрытым другими окнами).

Иначе вопрос решался бы вообще элементарно, в 1 строку:
if GetForegroundWindow <> Handle then ... // мы не сверху


Eraser   (2005-08-16 20:05:00) [11]

lox   (16.08.05 20:01) [3]

Алгоритм на основе GetNextWindow займёт 10-15 строк кода.


lox   (2005-08-16 20:01:00) [12]

А готовый решений нет?
решение Юрия Зотова неподходит, так как моё окно примерно 5-10 пикселей на экране.


Eraser   (2005-08-16 19:34:00) [13]

lox   (16.08.05 18:23)

Можно использовать ф-ю GetNextWindow. Тут уж можно наваять несколько алгоритмов.


Юрий Зотов   (2005-08-16 19:25:00) [14]

Навскидку пришло в голову.

1. Получаем прямоугольник своего окна (GetWindowRect).
2. Перебираем окна (EnumWindows).
3. Для каждого окна тоже получаем его прямоугольник.
4. Находим общий прямоугольник (IntersectRect).
5. Если он не пустой, то берем точку в его центре и вызываем WindowFromPoint. Если получен хэндл не нашего окна - то наше окно снизу, цикл можно заканчивать.

Недостаток - способ не сработает для задизабленных окон.


Наверх

Титульная страница Поиск, карта сайта Написать письмо