![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать: окно поверх других или нет, если есть хендел? [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. Если получен хэндл не нашего окна - то наше окно снизу, цикл можно заканчивать.
Недостаток - способ не сработает для задизабленных окон.