2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Обновление пиктограммы приложения
Сообщение22.05.2016, 19:11 


09/06/12
137
Когда Windows обновляет системную область (System Tray), некоторые иконки перерисовываются, а некоторые пропадают.
Как приложение должно определять момент, когда нужно перерисовать свою иконку? обрабатывать какое-то оконное
сообщение (WM_xxx)? подписаться на какие-то уведомления оболочки (Shell)?

 Профиль  
                  
 
 Re: Обновление пиктограммы приложения
Сообщение22.05.2016, 22:24 
Заслуженный участник


27/04/09
28128
Кажется, наоборот, трей обновляется тогда, когда программа соизволит добавить/изменить/удалить иконку (или показать уведомление), и момент этот выбираете только вы. По крайней мере, я помню, что был(а/и) функци(я/и) для этого, в том числе регистрирующие и один довольно скучный callback обработки сообщений мыши, от которых передаются, к тому же, экранные координаты, а не относительно границ иконки.

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

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

 Профиль  
                  
 
 Re: Обновление пиктограммы приложения
Сообщение22.05.2016, 23:30 


09/06/12
137
arseniiv, не только. Инода системная область полностью перерисовывается не по инициативе приложения, а по инициативе системы. Вопрос как раз в том, как программе, которая уже вывела свою иконку (посредством вызова функции Shell_NotifyIcon(NIM_ADD, &nid)), определить, что это нужно сделать заново ещё раз.

 Профиль  
                  
 
 Re: Обновление пиктограммы приложения
Сообщение22.05.2016, 23:37 
Заслуженный участник


27/04/09
28128
А вы проверяли, удалится ли иконка программы, которая ничего специально для этого не делает, при перерисовке? Если нет, то вдруг не удалится, и все параметры иконок могли бы храниться к моменту перерисовки где-нибудь, чтобы быть использованными. (Я в той статье не нашёл ни слова на эту тему, к сожалению.)

 Профиль  
                  
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 00:07 


09/06/12
137
Не просто проверял, а постоянно сталкиваюсь с этой проблемой.
Я не нашёл об этом ни слова не только в этой статье.

 Профиль  
                  
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 01:43 
Заслуженный участник


27/04/09
28128
При этом некоторые другие приложения эту проблему обходят? Тогда печально. :| Надеюсь, кто-нибудь знающий в эту тему зайдёт.

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

 Профиль  
                  
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 02:20 
Заслуженный участник


20/08/14
11781
Россия, Москва
Инициировать процесс перерисовки иконок в трее (и не только его) можно убийством приложения explorer.exe, отвечающего за рабочий стол. После его закрытия система обычно сразу же его снова запускает сама (если не запустился, то можно и руками запустить, через диспетчер задач), ну а он отрисовывает все иконки и прочее. По крайней мере в винде до 8-й. Криво конечно, но зато 100% работает.
И подозреваю на 95% что для перерисовки иконок в трее соответствующее приложение вообще никак не дёргается, а используются сохранённые данные у самого explorer. Именно поэтому приложению нужно вызывать функции для смены отображения иконки, а не просто молча изменить массив пикселей где-то у себя.

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

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

 Профиль  
                  
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 02:47 
Заслуженный участник


27/04/09
28128
Dmitriy40 в сообщении #1125315 писал(а):
Инициировать процесс перерисовки иконок в трее (и не только его) можно убийством приложения explorer.exe
Ой, точно ведь.

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

 Профиль  
                  
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 03:57 
Заслуженный участник


20/08/14
11781
Россия, Москва
arseniiv в сообщении #1125316 писал(а):
Только я не понимаю теперь, в каком случае пропадает она у armez.
Как раз при перезапуске explorer некоторые иконки и могут пропасть. Приложение при этом остаётся запущенным, оно даже может обновлять свои иконки, но в трее они всё равно не показываются. И единственный известный мне способ их там восстановить без перезапуска приложения или винды - сбросить и снова поставить галку "показывать иконку в трее" в самом приложении. Во всяком случае мне известны по крайней мере два полезных небольших приложения, с которыми такой глюк происходил 100% (под WinXP). Под Win7 я ими уже не пользуюсь, да и explorer тут не вылетает как раньше, так что ничего толкового сказать не могу, могли и полечить проблему.

 Профиль  
                  
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 11:46 


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

 Профиль  
                  
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 12:54 
Заслуженный участник


20/08/14
11781
Россия, Москва
Я не просто так перечислил варианты, т.к. они надёжно дают нужный результат - их можно использовать для проведения тестов. Ставить заглушки и смотреть какие вообще сообщения приходят приложению. Своему тестовому и паре-тройке тех, кто глючит и кто не глючит. Искать разницу в поведении, связанную с иконками - и проверять на своём приложении. Дело муторное, но если гугл ответа не знает ...
Конечно если если кто-то не даст сразу полного ответа (которого я не знаю).
Возможно полезно перерисовать иконку при получении сообщения о перерисовке окна приложения - уж оно точно должно приходить от системы при глюке explorer-а.

 Профиль  
                  
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 13:05 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Постоянно сталкиваюсь с удвоением иконки приложения в трее (см. скриншот ниже). Этим грешит Win7. Дублируются иконки в скрытой части лотка, которая разворачивается по клику на треугольничек (возм., будут удваиваться и не скрытые, не проверял). Если провести над ними мышкой, лишний значок исчезает. Вот это уж по-любому неправильное поведение. Замечено пока только для иконок Skype и μTorrent, из чего можно сделать вывод, что в глюке виноваты в том числе и сами программы, а не только Винда.
Есть предположения, откуда это берётся?

Изображение

 Профиль  
                  
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 13:13 
Заслуженный участник
Аватара пользователя


01/08/06
3131
Уфа
Обычно такое бывает, когда когда-то был запущен один процесс, потом второй, потом первый упал (или не потом, а до того, как второй запустился) и не отжался. explorer некоторое время не соображает, что иконка соответствует почившему процессу.

 Профиль  
                  
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 13:34 
Заслуженный участник


20/08/14
11781
Россия, Москва
Именно это я и описывал выше, что пока по иконке не пройдёт мышка - система не проверяет наличие соответствующего приложения. Только когда сообщение некуда посылать - тогда и очухивается и удаляет иконку. От спрятанности иконок это не зависит. И было и на WinXP тоже.

-- 23.05.2016, 13:40 --

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

 Профиль  
                  
 
 Re: Обновление пиктограммы приложения
Сообщение23.05.2016, 14:01 
Заслуженный участник


04/03/09
910
Решение проблемы такое: подписываемся на сообщение о создании таскбара.
Используется синтаксис C
UINT s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group