crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> WinAPI. Иконка в трее после рестарта explorer.exe, Хорошим тоном является отработка сообщения о рестарте панели задач
Klabush
  опции профиля:
сообщение 11.10.2007, 14:17
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 10.10.2007
Пользователь №: 7

Спасибо сказали: 0 раз(а)




Репутация:   0  


Известно, что в Windows «панель задач», кнопка «пуск», иконки в трее и прочая фигня принадлежат процессу explorer.exe. Именно этот процесс шлёт мессаджи окнам других процессов, когда мы нажимаем кнопки и ярлыки панели задач, заставляя их вылезать на передний план, сворачиваться, разворачиваться и закрываться.
То же происходит, когда мы кликаем по иконке в трее. Explorer.exe знает, с каким процессом и окном ассоциирована каждая добавленная в трей иконка, и посылает этому окну сообщения, когда мы кликаем разными кнопками мыши по ней.
Увы, процесс explorer.exe не идеален, и, как и все процессы Майкрософта, склонен к падениям, особенно если с системой интенсивно работать. Если он упадёт, это не страшно – главный процесс winlogon запустит новый процесс explorer. Если этого не произойдёт – его всегда можно запустить ручками, через Task Manager, например.
Но интересно не это. А интересно то, что при старте нового explorer трей как бы и не обновляется. Это нормально – ведь не знает explorer о том, что до его падения были запущены некоторые процессы, и они указали, что такие-то иконки связаны с такими-то окнами.
Есть неплохой видеоплеер Light Alloy. Всем хорош – и управлять им легко, и яркость-констрастность регулировать просто на лету и горячими клавишами (впрочем, это зависит от кодека), и по ескейпу закрывается, если приближается начальство. :)
Этот плеер умеет сворачиваться в трей. Это когда в свёрнутом состоянии главное окно полностью отправляется в invisible (кнопка этого окна становится не видна на панели задач), а остаётся лишь иконка в трее. По клику на иконку главное окно опять становится видимым, разворачивается и мы вновь можем работать с плеером.
И вот вы смотрите интересный фильм, а тут бац – explorer.exe досрочно прекращает свою работу и прощается с нами. Мы сворачиваем окно плеера, допустим нам это очень надо. Затем запускаем новую копию explorer.exe, которая рисует новую панель задач, отрисовывает кнопки активных приложений с окнами. Но нашего плеера там нет. Он «свёрнут в трей», его главное окно невидимо. Но и в трее его иконки нет! И получается, что до плеера-то нашего никак не добраться. Висит эдакое чудо с недосмотренным фильмом в памяти, и ждёт только одного – сообщения о нажатии кнопки мыши по иконке в трее. И не дождётся никогда, ибо новый explorer.exe о нашей иконке и знать не знает.
Висящий плеер нам практически не доступен. Главное его окно невидимо и сообщений не принимает. Более того, мы не знаем его дескриптор, да и если бы знали – посылать ему искусственно мессадж геморрой ещё тот. Поэтому что мы можем сделать? Правильно, прибить процесс плеера, как бы жалко нам его не было.
К чему я всё это? К тому, что красивая и мощная программа Light Alloy неудовлетворительно работает с треем. И не только она. Это не глюк, это недоработка. Чтобы такого не случалось в наших программах, надо всего лишь получить (используя APIшную функцию RegisterWindowMessage) зарегистрированный с текстом «TaskbarCreated» мессадж и ловить его в наших программах. При получении такого мессажда просто переустановить иконки трея, относящиеся к нашей программе.
Всего пара строчек кода, а польза налицо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 10.7.2020, 11:45