Если ваше приложение создает и использует свою иконку в трее, то в обязательном порядке надо обрабатывать ситуацию, когда по какой-либо причине произошел сбой и перезапуск Explorer'а. В этом случае перерисовывается панель задач, рабочий стол, системный трей со значками и т.д., и если вы не вернете свою иконку в трей, то она "потеряется". При аварийном перезапуске Explorer'а всем окнам (HWND_BROADCAST) системой отсылается сообщение TaskbarCreated. Особенность этого сообщения в том, что оно не имеет постоянного значения идентификатора, и его значение должно быть получено функцией
RegisterWindowMessage. В описаниях этой функции сказано, что она используется для регистрации уникального системного сообщения, но почему-то нигде не указано, что если такое сообщение уже зарегистрировано в системе, то функцией возвращается его существующий идентификатор. Это полезное свойство мы и будем использовать.
; Сегмент данных
...
szTBC db 'TaskbarCreated',0 ; Имя сообщения
restore_msg dd ? ; Идентификатор сообщения TaskbarCreated
...
Значение идентификатора лучше всего получать на этапе инициализации окна или при запуске приложения, но в любом случае до того, как будет выполняться его обработка.
; Сегмент кода
...
; Зарегистрировать сообщение TaskbarCreated
invoke RegisterWindowMessage,szTBC
mov [restore_msg],eax
...
После того, как у вас есть идентификатор сообщения, его можно использовать в обработчике сообщений окна вашего приложения. И, как только оно будет получено, следует просто обновить иконку вашего приложения в трее и выполнить какие-нибудь другие действия по восстановлению работоспособности после перезапуска Explorer'а.
...
; Сообщение TaskbarCreated?
mov eax,[msg]
cmp eax,[restore_msg]
je .wmrestore
...
.wmrestore:
; Восстановить иконку в трее
invoke Shell_NotifyIcon, NIM_ADD, node
jmp .processed
...
В этом коде подразумевается, что структура node (NOTIFYICONDATA) была заполнена ранее и содержит всю необходимую информацию об иконке в трее.
В приложении пример программы, которая создает иконку в трее и восстанавливает ее в случае сбоя и перезапуска Explorer'а.