2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2  След.
 
 Обновление пиктограммы приложения
Сообщение22.05.2016, 19:11 
Когда Windows обновляет системную область (System Tray), некоторые иконки перерисовываются, а некоторые пропадают.
Как приложение должно определять момент, когда нужно перерисовать свою иконку? обрабатывать какое-то оконное
сообщение (WM_xxx)? подписаться на какие-то уведомления оболочки (Shell)?

 
 
 
 Re: Обновление пиктограммы приложения
Сообщение22.05.2016, 22:24 
Кажется, наоборот, трей обновляется тогда, когда программа соизволит добавить/изменить/удалить иконку (или показать уведомление), и момент этот выбираете только вы. По крайней мере, я помню, что был(а/и) функци(я/и) для этого, в том числе регистрирующие и один довольно скучный callback обработки сообщений мыши, от которых передаются, к тому же, экранные координаты, а не относительно границ иконки.

-- Пн май 23, 2016 00:31:11 --

Может быть, вам будет интересно глянуть это: (MSDN) Notifications and the Notification Area. Внизу там ещё ссылки на разные функции и структуры. Плюс, в используемом вами языке может быть какая-то библиотека для более удобной работы с треем.

 
 
 
 Re: Обновление пиктограммы приложения
Сообщение22.05.2016, 23:30 
arseniiv, не только. Инода системная область полностью перерисовывается не по инициативе приложения, а по инициативе системы. Вопрос как раз в том, как программе, которая уже вывела свою иконку (посредством вызова функции Shell_NotifyIcon(NIM_ADD, &nid)), определить, что это нужно сделать заново ещё раз.

 
 
 
 Re: Обновление пиктограммы приложения
Сообщение22.05.2016, 23:37 
А вы проверяли, удалится ли иконка программы, которая ничего специально для этого не делает, при перерисовке? Если нет, то вдруг не удалится, и все параметры иконок могли бы храниться к моменту перерисовки где-нибудь, чтобы быть использованными. (Я в той статье не нашёл ни слова на эту тему, к сожалению.)

 
 
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 00:07 
Не просто проверял, а постоянно сталкиваюсь с этой проблемой.
Я не нашёл об этом ни слова не только в этой статье.

 
 
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 01:43 
При этом некоторые другие приложения эту проблему обходят? Тогда печально. :| Надеюсь, кто-нибудь знающий в эту тему зайдёт.

Кстати,
armez в сообщении #1125280 писал(а):
Инода системная область полностью перерисовывается не по инициативе приложения, а по инициативе системы.
наверно, вы тогда уже обратили внимание, в каких случаях это бывает? Может, их можно перечислить, и в каждом из них обновление затрагивает ещё какую-то вещь, о которой сообщение посылается? Мне просто показалось, что, например, этим могла бы сопровождаться смена темы (и/или системных цветов), о которых сообщение должно бы слаться, т. к. я в .net видел соответствующее событие. Может, будет какой толк.

 
 
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 02:20 
Инициировать процесс перерисовки иконок в трее (и не только его) можно убийством приложения explorer.exe, отвечающего за рабочий стол. После его закрытия система обычно сразу же его снова запускает сама (если не запустился, то можно и руками запустить, через диспетчер задач), ну а он отрисовывает все иконки и прочее. По крайней мере в винде до 8-й. Криво конечно, но зато 100% работает.
И подозреваю на 95% что для перерисовки иконок в трее соответствующее приложение вообще никак не дёргается, а используются сохранённые данные у самого explorer. Именно поэтому приложению нужно вызывать функции для смены отображения иконки, а не просто молча изменить массив пикселей где-то у себя.

Ещё один способ заставить систему перерисовать иконки - потянуть за task bar и изменить его размеры. При этом все иконки будут перегруппированы и соответственно перерисованы. А приложения уверен и не дёрнутся, система сама всё сделает.

Т.е. приложение перерисовывать свою иконку не должно никогда. Оно просто регистрирует иконку и всё (и может потом её обновлять или удалять), а перерисовкой полностью занимается система.
Потому при вылете приложения его иконка в трее может остаться (с неоднократными перерисовками!) до момента прохода мышкой над ней - приложению попытается послаться сообщение про мышь и только тогда система поймёт что иконка "дохлая" и удалит её.

 
 
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 02:47 
Dmitriy40 в сообщении #1125315 писал(а):
Инициировать процесс перерисовки иконок в трее (и не только его) можно убийством приложения explorer.exe
Ой, точно ведь.

В принципе, система могла бы проверять (при перезапуске проводника или ещё в каких экстренных случаях — но при этом не при обычных действиях с треем типа открытия скрытых иконок), запущен ли процесс, чьё окно было указано в hWnd при создании иконки, и если уже нет, она может удалять иконку. Только я не понимаю теперь, в каком случае пропадает она у armez.

 
 
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 03:57 
arseniiv в сообщении #1125316 писал(а):
Только я не понимаю теперь, в каком случае пропадает она у armez.
Как раз при перезапуске explorer некоторые иконки и могут пропасть. Приложение при этом остаётся запущенным, оно даже может обновлять свои иконки, но в трее они всё равно не показываются. И единственный известный мне способ их там восстановить без перезапуска приложения или винды - сбросить и снова поставить галку "показывать иконку в трее" в самом приложении. Во всяком случае мне известны по крайней мере два полезных небольших приложения, с которыми такой глюк происходил 100% (под WinXP). Под Win7 я ими уже не пользуюсь, да и explorer тут не вылетает как раньше, так что ничего толкового сказать не могу, могли и полечить проблему.

 
 
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 11:46 
В принципе, Dmitriy40 уже перечислил некоторые случаи такой перерисовки. Можно добавить выход из спящего режима. Не исключено, что этот список можно продолжить. Поэтому и хотелось знать, как отследить все такие случаи. Вопрос не в том, КАК перерисовать иконку (в конце концов, если нужно, приложение может её удалить и добавить снова с помощью всё той же функции Shell_NotifyIcon), а в том, КОГДА это делать, чтобы она восстанавливалась даже после сбойных ситуаций. Повторю ещё раз - некоторые пиктограммы перерисовываются, а некоторые - нет, причём всегда - одни и те же. Почему это происходит?

 
 
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 12:54 
Я не просто так перечислил варианты, т.к. они надёжно дают нужный результат - их можно использовать для проведения тестов. Ставить заглушки и смотреть какие вообще сообщения приходят приложению. Своему тестовому и паре-тройке тех, кто глючит и кто не глючит. Искать разницу в поведении, связанную с иконками - и проверять на своём приложении. Дело муторное, но если гугл ответа не знает ...
Конечно если если кто-то не даст сразу полного ответа (которого я не знаю).
Возможно полезно перерисовать иконку при получении сообщения о перерисовке окна приложения - уж оно точно должно приходить от системы при глюке explorer-а.

 
 
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 13:05 
Аватара пользователя
Постоянно сталкиваюсь с удвоением иконки приложения в трее (см. скриншот ниже). Этим грешит Win7. Дублируются иконки в скрытой части лотка, которая разворачивается по клику на треугольничек (возм., будут удваиваться и не скрытые, не проверял). Если провести над ними мышкой, лишний значок исчезает. Вот это уж по-любому неправильное поведение. Замечено пока только для иконок Skype и μTorrent, из чего можно сделать вывод, что в глюке виноваты в том числе и сами программы, а не только Винда.
Есть предположения, откуда это берётся?

Изображение

 
 
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 13:13 
Аватара пользователя
Обычно такое бывает, когда когда-то был запущен один процесс, потом второй, потом первый упал (или не потом, а до того, как второй запустился) и не отжался. explorer некоторое время не соображает, что иконка соответствует почившему процессу.

 
 
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 13:34 
Именно это я и описывал выше, что пока по иконке не пройдёт мышка - система не проверяет наличие соответствующего приложения. Только когда сообщение некуда посылать - тогда и очухивается и удаляет иконку. От спрятанности иконок это не зависит. И было и на WinXP тоже.

-- 23.05.2016, 13:40 --

Насколько виновато в таком приложение - не уверен, конечно надо удаление иконок ставить в try..finally блоки, но не после любой ошибки в приложении можно корректно всё закрыть (в том числе иконки в трее), да и не всегда даже такие блоки будут выполнены. Считаю это недоработкой винды, с которой придётся бороться левыми способами. И о них и интересно узнать.

 
 
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 14:01 
Решение проблемы такое: подписываемся на сообщение о создании таскбара.
Используется синтаксис C
UINT s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));

А потом, когда получаем это сообщение, пересоздаем иконку в трее. Это работает по крайней мере при перезапуске explorer.exe.
А вот при изменении размеров таскбара у меня и без этого иконка не пропадает.

 
 
 [ Сообщений: 20 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group