Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.11;
Скачать: CL | DM;

Вниз

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

 
lox   (2005-08-16 18:23) [0]

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


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

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

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

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


 
Eraser ©   (2005-08-16 19:34) [2]

lox   (16.08.05 18:23)

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


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

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


 
Eraser ©   (2005-08-16 20:05) [4]

lox   (16.08.05 20:01) [3]

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


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

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

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

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


 
Eraser ©   (2005-08-16 20:23) [6]

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


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


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

> lox   (16.08.05 20:01) [3]

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


 
lox   (2005-08-17 08:53) [8]

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


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

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


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


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


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


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

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


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

http://delphimaster.net/view/4-1124275353/

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


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

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


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

> lox   (17.08.05 18:14) [13]

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



Страницы: 1 вся ветка

Текущий архив: 2005.09.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
2-1123268388
Peter1
2005-08-05 22:59
2005.09.11
есть ли разница в объявлении таких процедур?


1-1124273583
Novice
2005-08-17 14:13
2005.09.11
Определение параметров при запуске приложения


1-1124729415
futility
2005-08-22 20:50
2005.09.11
работа с IE и вообще с браузерами


3-1122729432
r2d2
2005-07-30 17:17
2005.09.11
как обнулить автоикрементное поле в таблице Paradox?


5-1098135317
Михель
2004-10-19 01:35
2005.09.11
Подскажите, как правильно переопределить свойство компонента!