Примусове оновлення ікон в треї
Проект фактично являє собою онлайн сховище вільно поширюваного програмного коду. Свої розробки тут можуть розміщувати всі охочі, а доступ до проектів можна отримати всім користувачам з будь-якої точки світу.
- У нас можна красиво оформити статтю скориставшись BB кодами.
Примусове оновлення ікон в треї
У разі аварійного завершення або некоректної роботи деяких додатків, в системному треї можуть залишатися "мертві" іконки, які вже не належать жодному запущеному процесу. Глюк хоч і не смертельний, але все одно неприємний. І основна проблема в тому, що область трея ніяк не реагує на зовнішні повідомлення типу WM_REPAINT. і функції типу UpdateWindow і InvalidateRect. Тобто автоматично оновити або перемалювати його, щоб позбутися від "мертвих" іконок, не вийде. Але такі іконки видаляються, якщо провести курсором мишки над ними. Значить єдиний спосіб перемалювати іконки в треї - це семуліровать рух миші над вікном трея. Як знайти вікно трея і його хендл ми вже знаємо, тут нічого нового. У сегменті даних ті ж значення:
З пошуком вікна теж ніяких проблем. Спосіб універсальний, прекрасно працює на Windows XP і Windows 7.
Вікно трея знайдено, залишилося семуліровать рух мишки. Для цього треба просто отримати розміри вікна трея і в циклі відправити повідомлення WM_MOUSEMOVE. Не обов'язково емулювати рух мишки над кожною точкою вікна, досить пройтися один раз над кожною іконкою. Так як розмір маленької іконки 16х16 пікселів, то крок виберемо також 16.
І, власне, сам код. Зверніть увагу, що повідомлення трею ми відправляємо через PostMessage, щоб не витрачати час на очікування від нього відповіді.
Цей спосіб, незважаючи на те, що він працює, не позбавлений недоліків. Деякі додатки, що встановлюють свої іконки в трей, реагують на переміщення курсора над ними. Наприклад, антивірус DrWeb показує спливаюче вікно з версією своєї бази, менеджер USB-пристроїв Zentimo показує вікно зі списком підключених пристроїв, якісь інші програми також можуть виконувати свої дії. Так ось, раз ми емулюючи рух мишки над іконками, то і програми спрацьовують на це як на реальний рух курсора. Якщо ви використовуєте трюк з оновленням трея в своїй програмі, то обов'язково оформляйте його як відключається опцію з попередженням про можливу несумісність. На жаль, поки що це єдиний реальний спосіб змусити Провідник перемалювати іконки в треї з призначеного для користувача програми.
У додатку приклад програми, відновлює іконки в треї описаним в статті способом. Для тестів додається програма, яка встановлює свою іконку в трей, і не видаляє її після виходу.