+2

не обновляется иконка в трее в windows.

kruvas 12 year бұрын в Предложения пользователей updated by Михаил 10 year бұрын 5

известная для виндузятников фича-баг. если эксплорер крашится, то  пропадает иконка приложения, сидящего в трее без кнопки на панели задач.

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

помнится, когда многие были не в курсе, вытгивали обратно с помощью process explorer от русиновича, там было window->bring to front. но у HK uploader даже окна нет )


сейчас таких приложений (не восстанавливающих иконку после краша эксплорера) я уже не знаю. исправьте пожалуйста этот досадный баг


чтобы воспроизвести (на xp) надо в диспетчере задач сначала убить explorer, а потом снова его запустить оттуда же

Постараюсь поправить данную проблему в очередной версии, хотя пока не уверен что там есть какие-либо сообщения о краше. В общем нужно будет посмотреть. И, надеюсь, косяк остался на 7ке, а то придётся искать XP и разворачивать всю "кухню" там.

думаю что остался, возможно нужно будет выключить aero


сообщения о краше скорее всего и нет, но должно быть какой то системное сообщение типа repaint или типа того.


возможно эти обсуждения на stackoverflow подскажут куда копать

http://stackoverflow.com/questions/8333820/restoring-java-systray-icon-after-explorer-crashes

http://stackoverflow.com/questions/7923645/how-to-re-add-icon-to-system-tray-after-explorer-exe-crash/7923753

https://forums.oracle.com/forums/thread.jspa?threadID=2159870

http://syedgakbar.wordpress.com/2008/07/14/restore-notification-area-icon-after-explorer-crash/



тут по виндовым сообщениям и таксбару

http://msdn.microsoft.com/en-us/library/cc144179(VS.85).aspx#Taskbar_


тут решение для сишников

http://www.tek-tips.com/faqs.cfm?fid=5937


тут пишут, что в java такое не получится сделать, надо делать костыли

http://board.jdownloader.org/showthread.php?p=81757

или стартовать прогу заново и та, обнаружив запущенную копию, даст ей сигнал чтобы восстановить иконку (что мне лично кажется совсем костыльным костылем ))) )

либо тупо удалять/восстанвливать иконку в трее каждые несколько секунд - что более удовлетворительно, если не будет каких то побочных эффектов

Собственно, судя по первым двум топикам на stackoverflow стандартный путей решения проблемы нет. Да и вообще вся система работы с треем на Java пока-что - один большой костыль.

Лично моё предположение - проверять висит ли иконка в трее каждые пару секунд и при её отсутствии добавлять туда. Ну или как более суровый вариант следить за ID explorer.exe процесса и при его смене передобавлять иконку (это было предожено, но это далеко не самый лучший вариант).

В любом случае - не уверен в том, насколько резонно делать подобные костыли. Возможно стоит просто обновлять иконку при сворачивании в трей по горячей клавише? Ведь вернуть окно (и свернуть его в трей) по прежнему возможно, если задан глобальный хоткей.

если бы вы почитали ссылочку https://forums.oracle.com/forums/thread.jspa?threadID=2159870, то поняли, что проверка иконки в трее через getTrayIcons() не сработает - они после краша остаются на месте и проверка будет говорить что все ок, а в реальности иконки не будет.

по той же ссылке якобы нашли решение через reflections. хотя пожаловались на стабильность работы


try{
     Field theField = TrayIcon.class.getDeclaredField( "peer" );
     theField.setAccessible( true );
     theField.set( myIcon, null );
     Method theMethod = TrayIcon.class.getDeclaredMethod( "addNotify", new Class[]{} );
     theMethod.setAccessible( true );
     theMethod.invoke( myIcon, new Object[]{} );
} catch ( Throwable e ) {
     LOGGER.error( "Could not restore system tray icon", e );
}


если это чем то не устроит, то думаю и правда - достаточно дергать иконку при каждом срабатывании глобального хоткея - к примеру ctrl+H (показать окно) или вообще на всех хоткеях. сделал попытку что то с прогой сделать - и иконка перерисовалась. но тогда нельзя будет определить  запущена программа или нет ( для чего собственно иконка и нужна чаще всего)

Не прочитал я все топики потому, что ещё не добрался до правки кода и лишь поверхностно просмотрел первые статьи, приведённые вами.


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


Единственный действенный способ восстановить иконку (причем достаточно оперативно) - постоянно или же по некоторым действиям обновлять её. При этом будет заметно обновление иконки в трее, если explorer.exe не перезапускался, что весьма неприятно и создаст лишние неудобства для тех, кто не испытывает проблем с перезапуском explorer.exe.


И напоследок хотел спросить - неужели у вас настолько часто "падает" explorer? Работал более четырёх лет на XP - не помню того, чтобы explorer настолько часто давал сбои...