Форум: "Основная";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];
ВнизКак узнать: окно поверх других или нет, если есть хендел? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.011 c