![]() |
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]() ![]() ![]() |
|
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
Чучмек, выскажись по-подробнее....
Это сообщение отредактировал(а) MetalFan - 12.1.2012, 22:58 -------------------- There are always someone smarter than you... |
|||
|
||||
Чучмек |
|
|||
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 7 Всего: 41 |
Если окно приложения перекрыто другими окнами и становится активным, то для окна вызывается OnPaint
А если окно не перекрыто - то OnPaint не вызывается. Отсюда решение: По клику на иконку в трее сделать окно активным и запустить ожидание события OnPaint (0,5 сек) Если событие не произошло - скрыть окно. Это сообщение отредактировал(а) Чучмек - 12.1.2012, 21:55 -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
Чучмек, хм, как самый крайний вариант может и сойдет, но, имхо, не очень красивое решение...
-------------------- There are always someone smarter than you... |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Выяснил, что все функции работают только в контексте цепочки окна. Я не нашёл ни одной функции, которая давала бы доступ к глобальному Z-порядку.
Для теста использовал такой код:
Предлагаю попробовать так: перечислить все окна. Отобрать из них те, которые видимые, не SOT и пересекают твой клиентский прямоугольник. Если такие есть - ты перекрыт, давай наверх. Если таких нет - ты наверху, убирайся в трей. Добавлено через 3 минуты и 59 секунд Возможно, вместо перечисления окон можно глянуть в сторону GetClipBox. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
Чучмек |
|
|||
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 7 Всего: 41 |
PtVisible
-------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
Qu1nt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 602 Регистрация: 13.1.2007 Репутация: 22 Всего: 50 |
http://delphimaster.net/view/2-1169797326
Или вот, что получилось у меня.
Это сообщение отредактировал(а) Qu1nt - 13.1.2012, 17:12 |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
не понял, как это определить... если просто сравнить пересечение прямоугольников окон. так если чужое окно будет под или над моим, получается, что прямоугольники пересекуться... а вот это посмотрим хм, и что, проверять каждый пиксель формы? ну как еще один крайний вариант - сойдет. хотя оно же не учитывает так называемые SOT окна наверняка. Qu1nt, да, тема стара, как мир))) предложенный код исходит из предположения, что EnumWindows перечисляет окна в порядке видимости сверху вниз? А список исключения по ClassName если вдруг поменяется? программа какая-либо сторонняя вдруг так же вылезет "наверх"... спасибо, как вариант, возможно прокатит. Но как-то на мой взгляд не надежно.... Добавлено @ 09:12 з.ы. как же ритлабовцы в своем thebat добились нужного поведения... и uTorrent тоже как надо работает.... Это сообщение отредактировал(а) MetalFan - 13.1.2012, 09:15 -------------------- There are always someone smarter than you... |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Не видел TheBat, но может они читерят
![]() Например, первый клик - если окно видимо, то наверх его. Если второй клик (но не дабл-клик) происходит менее чем через 2 сек после первого - то свернуть окно, если позднее - то начать с начала. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
CodeMonkey, неа... даж если надо окном бата/utorrenta поместить, к примеру, калькулятор, то при клике на иконку в трее окно не свернется в трей, а "переедет" на передний план.
Сегодня попробую все предложенные варианты, отпишусь. Добавлено через 2 минуты и 29 секунд вот еще рещение, как раз, как ты писал с проверкой на пересечение окон, что выше по Z-порядку находятся. В общем надо пробовать. -------------------- There are always someone smarter than you... |
|||
|
||||
MetalFan |
|
||||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
Небольшой подитог: все способы, определяющие частично перекрытие окна не катят на мой взгляд. т.к. неправильно сработают в след.ситуации: наше окно открыто не на весь экран и видно полностью, рядом АКТИВНО окно другого приложения так же не на весь экран и не перекрывающее наше окно. В этом случае по логике с перекрытиями наше окно считается поверх всех, т.к. видно полностью, что на мой взгляд неправильно.
Вариант Qu1nt вроде как работает правильно, только вот не нравятся мне проверка на классы окон, ибо может появиться вдруг еще какой-нибудь класс, который сломает сию добрую логику... и одна вот эта часть проверки, кмк, так же написана неверно (скобок не хватает):
Разве должно быть не так:
-------------------- There are always someone smarter than you... |
||||
|
|||||
MetalFan |
|
||||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
В общем модифицировал функцию от Qu1nt и все заработало ПОЧТИ как надо:
Это Почти заключается в небольшом отличии от поведения ранееупомянутой мыши. Наше окно всегда считается foreground, даже если сейчас активно другое окно с ExStyle = WS_EX_TOPMOST... С одной стороны это наверное правильно... Замена проверки ExStyle на WS_EX_TOOLWINDOW привело к тому, что если на экране есть одно SOT-окно, то наше окно вообще перестает сворачиваться (такое же поведение и у uTorrent, кстати). Как же в бате сделали разработчики, чтобы все работало как надо красиво... загадка. -------------------- There are always someone smarter than you... |
||||
|
|||||
Qu1nt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 602 Регистрация: 13.1.2007 Репутация: 22 Всего: 50 |
Ой, не там скобку убрал:
Подход основывался на: http://stackoverflow.com/questions/210504/...ke-alt-tab-does http://code.google.com/p/k-kovalev-persona...DataProvider.cs |
|||
|
||||
Qu1nt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 602 Регистрация: 13.1.2007 Репутация: 22 Всего: 50 |
MetalFan, уточни какого поведения ты хочешь добиться.
|
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
Qu1nt, поведение я ж вроде описывал.
Необходимо момент нажатия на иконку в трее: 1. Если окно свернуто, то развернуть его. 2. Если окно приложения активно в данный момент, то свернуть его "в трей". 3. Если окно развернуто из трея, но не активно в данный момент, то сделать его активным. в п.3 как раз и загвоздка. Как корректно определить, активно ли окно в момент нажатия на иконку в трее. Самый приближенный к "правде" вариант - последний приведенный мною на основании твоего кода. -------------------- There are always someone smarter than you... |
|||
|
||||
Qu1nt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 602 Регистрация: 13.1.2007 Репутация: 22 Всего: 50 |
Вот еще вариант:
Разницы между поведением этого кода и The Bat! 5 не увидел. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |