Blog. Just Blog

Восстановление иконки в трее после сбоя системы

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Если ваше приложение создает и использует свою иконку в трее, то в обязательном порядке надо обрабатывать ситуацию, когда по какой-либо причине произошел сбой и перезапуск Explorer'а. В этом случае перерисовывается панель задач, рабочий стол, системный трей со значками и т.д., и если вы не вернете свою иконку в трей, то она "потеряется". При аварийном перезапуске Explorer'а всем окнам (HWND_BROADCAST) системой отсылается сообщение TaskbarCreated. Особенность этого сообщения в том, что оно не имеет постоянного значения идентификатора, и его значение должно быть получено функцией RegisterWindowMessage. В описаниях этой функции сказано, что она используется для регистрации уникального системного сообщения, но почему-то нигде не указано, что если такое сообщение уже зарегистрировано в системе, то функцией возвращается его существующий идентификатор. Это полезное свойство мы и будем использовать.
  1. ; Сегмент данных
  2. ...
  3. szTBC        db 'TaskbarCreated',0 ; Имя сообщения
  4. restore_msg  dd ?                  ; Идентификатор сообщения TaskbarCreated
  5. ...
Значение идентификатора лучше всего получать на этапе инициализации окна или при запуске приложения, но в любом случае до того, как будет выполняться его обработка.
  1. ; Сегмент кода
  2.         ...
  3.         ; Зарегистрировать сообщение TaskbarCreated
  4.         invoke  RegisterWindowMessage,szTBC
  5.         mov     [restore_msg],eax
  6.         ...
После того, как у вас есть идентификатор сообщения, его можно использовать в обработчике сообщений окна вашего приложения. И, как только оно будет получено, следует просто обновить иконку вашего приложения в трее и выполнить какие-нибудь другие действия по восстановлению работоспособности после перезапуска Explorer'а.
  1.         ...
  2.         ; Сообщение TaskbarCreated?
  3.         mov     eax,[msg]
  4.         cmp     eax,[restore_msg]
  5.         je      .wmrestore
  6.         ...
  7. .wmrestore:
  8.         ; Восстановить иконку в трее
  9.         invoke  Shell_NotifyIcon, NIM_ADD, node
  10.         jmp     .processed
  11.         ...
В этом коде подразумевается, что структура node (NOTIFYICONDATA) была заполнена ранее и содержит всю необходимую информацию об иконке в трее.

В приложении пример программы, которая создает иконку в трее и восстанавливает ее в случае сбоя и перезапуска Explorer'а.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Restore.Icon.in.Tray.Demo.zip (4,328 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 7404 | Комментариев: 4

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
zummenix (04.02.2011 в 17:35):
Вот и пригодилось, спасибо :)
Вова (03.03.2010 в 16:56):
Есть WMR - устроит ? на нужную программку - не жалко и помочь ! Тем более Вам ! RSS всегда на видном месте , жена любит читать твою кулинарию ... Сайт оч хороший , владелец отзывчивый , вот и решил обратиться .!
ManHunter (03.03.2010 в 10:19):
C тех пор, как человечество придумало деньги, количество нерешаемых проблем резко сократилось.
Вова (03.03.2010 в 08:41):
Дмитрий!Скажите пожалуйста , а не смогли бы Вы сделать программку , чтоб обычному человеку пользоваться, с функционалом отсюда - http://habrahabr.ru/blogs/pyth...06/#habracut , просто там дают код или как это называется , а применить не могу - незнаю как это работает .

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.005 сек.) / Память: 4.5 Mb
Наверх