|
|
|
Выяснить, является ли текущее окно (приложение) активным22.03.2010, 22:45. Показов 11074. Ответов 43
Метки нет (Все метки)
Хочу привинтить к программе tray-иконку. Часть логики должна выглядеть следующим образом. Если окно программы активно, то при клике на tray-иконку окно будет минимизировано. Если окно программы РАЗвёрнуто (т.е. НЕ минимизировано), но неактино (грубо говоря, находится где-то под другими окнами), то при клике на tray-иконку приложение всплывёт наверх
Проблема с тем, как определить является ли приложение активным. Вроде бы напрашивается логичное решение, что надо вызвать GetForegroundWindow() и сравнить с handle'ом текущего окна. Но проблема в том, что при нажатии мышкой на tray-иконку окно приложения теряет фокус (т.е. как бы фокус переходит на tray-иконку). Когда мышку отпустить, то фокус опять возвращается к окну приложения. Как это дело можно порулить?
0
|
|
| 22.03.2010, 22:45 | |
|
Ответы с готовыми решениями:
43
Как определить, является ли окно браузера активным? Консольное приложение выполняет обработку ArrayList быстрее (причем гораздо быстрее), когда является не активным |
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
|
|
| 24.03.2010, 21:22 | |
|
Че-то я потерял нить. А зачем вам хендл иконки вообще? Одних сообщений, приходящих от иконки в заданную при ее создании процедуру разве не достаточно?.
0
|
|
|
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
||
| 24.03.2010, 21:27 | ||
|
0
|
||
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
|
|
| 24.03.2010, 21:32 | |
|
Так а чем тут иконка поможет, если она вообще никаким боком не привязана ни к чему, кроме трея. И чем не подходит определение активного окна не по клику мышом на иконке а по перемещению указателя над ней - ведь в этот момент фокус еще никуда не переведен.
2
|
|
|
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
|||
| 24.03.2010, 21:45 | |||
|
К примеру,поведение квипа посмотрел. Он проверяет, есть ли над ним в его локальных координатах (0,0) какое-нибудь другое окно.Если есть - тащится наверх.Если нет - сворачивается. Добавлено через 2 минуты Хорошая мысль. Если там есть сообщение попадания указателя на иконку и сообщение об уходе указателя с иконки - можно скомбинировать. Завести,соответственно,еще один флаг. При переходе фокуса проверять,на трей или нет.Если на трей - проверять флаг положения мышки.Если где надо - делаем так,если где не надо - сяк
0
|
|||
|
|
|
| 24.03.2010, 22:33 [ТС] | |
|
Хм... с мышой надо попробовать
Добавлено через 4 минуты С виду вроде всё необходимое для этого есть. Надо прикинуть, нет ли каких подводных камней Добавлено через 39 минут Опять не канает. В момент нажатия мышкой сначала теряется фокус с окна, потом посылается сообщение, что мышь находится над tray (и в этот момент окно уже неактивно) и только потом посылается сообщение клика на tray. Да что же за свинство-то такое
0
|
|
|
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
||||||
| 24.03.2010, 22:44 | ||||||
|
Evg, тогда остается только такая лабуда.Напишу в псевдокоде.
0
|
||||||
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
|
|||||||
| 26.03.2010, 19:13 | |||||||
|
Я, кажется, не понял - а вы где сообщение ловите? В основном цикле своей програмы? Или чужой? Если своя, так в обработке WM_USER+ваша_константа - как раз и будет то, что надо. например на Delphi это выглядит как
причем приходить они будут только в ваше окно (Self.Handle) и только тогда, когда мыша над вашей иконкой. Прошу прощения, если излагаю тривиальности, но отчего-то показалось, что вы пытаетесь поймать мышу в своем основном цикле, причем ловите именно WM_MOUSE, а не сообщение вашей иконки.
1
|
|||||||
|
|
||||||||||||
| 27.03.2010, 01:03 [ТС] | ||||||||||||
0
|
||||||||||||
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
|
|
| 27.03.2010, 15:49 | |
|
Evg, а нарисуйте еще и код создания tray-иконки, а лучше киньте весь проект.
Сейчас где-то на час-полтора исчезну, а вечером гляну. На Delphi есть готовое решение, но раз у Вас, как я понял, Builder, то мой пример мало чем поможет для начинающего. У меня, правда, Builder не установлен, но думаю, это и не понадобится. А вообще-то, как мне кажется уж лучше сразу привыкать к MS, чем потом переучиваться с Borland'а, раз Вы все равно только начинаете.
1
|
|
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
|
|
| 27.03.2010, 17:43 | |
|
Evg!
Не дождавшись Вашего ответа, кину файлик для VS. а судя по Вашему коду у Вас должно быть что-то вроде после / или перед / или вместо MESSAGE_HANDLER (WM_WINDOWPOSCHANGING, TMessage, WM_WindowPosChanging) пишите MESSAGE_HANDLER (WM_MYMSG_FROM_TRAY_ICON, TMessage, MyIconMessagesHandler) естеcтвенно, ранее определив макрос WM_MYMSG_FROM_TRAY_ICON, например как #define WM_MYMSG_FROM_TRAY_ICON WM_USER + 1 а уже в MyIconMessagesHandler ловите по LParam приходящие от иконки сообщения (иконка посылает только мышиные - MOVE, DOWN, UP и DBLCLICK (всего 7 штук). Никаких других у меня получить от нее не получилось, хотя пытал почище гестапо.
1
|
|
|
|
|||||
| 27.03.2010, 19:37 [ТС] | |||||
|
Ещё раз хочется повторить задачу. Свернуть-развернуть приложение по нажатию на tray у меня проблемы нет. Проблема в том, как понять, что в момент нажатия на tray фокус текущей задачи находится НЕ на нашем приложении. Ещё у меня в приложении есть, например, окно с настройками, и когда оно включено, то формально главное приложение неактивно. А потому пляски с бубнами принимают неприятные масштабы. Я не сторонник сложных инженерных конструкций, держащихся на костылях и подпорках, а потому, если нет простого решения, я лучше забью на эту функциональность. Потому как я пока ни в одной программе её не видел
0
|
|||||
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
|
|
| 27.03.2010, 22:13 | |
|
Ну еж моеж. Так бы сразу и сказали, что пользуете компонетнту. Оттуда и все траблы. Только при чем тут API тогда непонятно. Я понимаю API-приложение как НЕ использующее никаких идиотских надстроек типа всяких навороченных библиотек. В Borland это VCL, в MS-MFC, и т.д.
Код, приведенный в моем примере полностью рабочий код и полностью (и исключительно) на API. Так что разбирайтесь. Говоря про VS, я имел ввиду, что хоть Delphi, хоть Builder, суть не меняется - все равно все основано на VCL. Мне, например, не нравится слишком много мусора в готовом приложении, т.к. тащится и нужное и ненужное. Правда, и MFC ничем не лучше, но я ее просто никогда не использовал. Тогда уж лучше VCL. По крайней мере в ней всякие траблы найти проще. Я просто решил, что пишите на чистом API. Задавать callback message в данном случае не надо. Это называется не callback, а скорее простое стандарное Windows сообщение, но которое определяете сами. Как это делается в Builder не скажу - вам ведь нужен именно синтаксис такого объявления. Насчет ловушек "в классе". Никаких классов там нет. Ни единого. Простая стандартная процедура обработки сообщений окном. И наконец, возвращаясь опять к тому, с чего все и начали. Определение активного окна надо делать не в событии КЛИКА, а в событии ПЕРЕМЕЩЕНИЯ мыши, запоминать его, а по клику - использовать ранее полученное. Никаких сложностей ни вам, ни Windows это не создаст. В самом крайнем случае можно снизить частоту вызовов GetForegroundWindow, используя таймер или как-то еще, но, насколько я знаю, так никогда не делает. MOUSE_MOVE на иконке в трее - не из тех событий, которые слишком уж загрузят проц. Посмотрите повнимательней мой код обработки WM_MOUSEMOVE. Естественно, мой пример абсолютно не рабочий (в смысле использовать в том виде, как есть, нельзя), я просто взял то, что выплюнул VS при создании нового проекта и добавил то, что нужно для вашей задачи. Если хотите, пошлю Exe-файл, где в окошке отчетливо видно, какое приложение в момент перемещения/клика по иконке находится "на верхнем уровне"
1
|
|
|
|
|||||||
| 27.03.2010, 22:33 [ТС] | |||||||
Вот если бы Exe-файл, который в момент клика мыши печатал 0 или 1 - это было бы интереснее
0
|
|||||||
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
|
|
| 28.03.2010, 00:04 | |
|
наконец-то въехал, в чем тут у вас проблема. Уж звиняйте за бестолковость.
Вот гляньте как сделал - там исходник, но, к сожалению опять только VS и готовый Exe И еще по ходу обнаружил хитрый трабл. Если завести глобальную переменную для Handle своего окна, и создавать иконку не передачей HWHD как параметра, а используя эту глобальную переменную, то иконка создается, но при первом наведении мыши на нее исчезает. Вот такие пироги. Учтите в своем проЭкте.
1
|
|
|
|
|
| 28.03.2010, 00:14 [ТС] | |
|
Работает, правда есть косячок - если щёлкнуть два раза с небольшим интервалом времени при развёрнутом окне (порядка секунды), то не работает как надо. Но это уже мелочи
Насколько я понял, ты всего учитывал не только последнее активное окно в событии MOUSEMOVE, но и предпоследнее. Так? И насколько такой вариант является надёжным?
0
|
|
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
|
|||
| 28.03.2010, 00:29 | |||
|
По крайней мере других идей пока нет.
1
|
|||
|
|
||||
| 28.03.2010, 00:59 [ТС] | ||||
Вроде бы всё необходимое лежало на поверхностиВ общем, спасибо за идею
0
|
||||
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
|
||
| 28.03.2010, 14:37 | ||
|
Но не в этом-ли наша сила, брат?
0
|
||
| 28.03.2010, 14:37 | |
|
Выяснить, является ли хоть одно из заданных слов палиндромом (GUI-приложение) Нужно закрыть модальное окно и сделать активным вызвавшее его окно Сделать окно активным, закрыть окно, открыть в текущем окне Сделать окно активным сделать окно активным Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
После бана на Пикабу не работает авторизация аккаунта с Яндекса.
Hrethgir 09.07.2026
В частности https:/ / auto. ru/ logbook/ zapret-na-vozhdenie-posle-65-let_1cf28789-07b4-4c75-a2f7-4cd4edf9deeb тут хотел оставить комментарий такой
Зрите в корень - монополизация на разработку программ. . .
|
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
|
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
|
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал.
Оно само - говорит.
Кто слышит тот слышит.
|
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|