|
|
|
Выяснить, является ли текущее окно (приложение) активным22.03.2010, 22:45. Показов 11242. Ответов 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-приложение) Нужно закрыть модальное окно и сделать активным вызвавшее его окно Сделать окно активным, закрыть окно, открыть в текущем окне Сделать окно активным сделать окно активным Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|
|
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки.
Добавлены следующие реквизиты типа Булево:
- Буквы;
- Цифры;
- Символы.
Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
|
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей.
Самым главным критерием для. . .
|
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store.
И так:
1. Скачиваем с. . .
|
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге).
Задача:
Программно добавить префикс в нумерацию документов.
Решение:
В модуле объекта. . .
|