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

Если ваше приложение создает и использует свою иконку в трее, то в обязательном порядке надо обрабатывать ситуацию, когда по какой-либо причине произошел сбой и перезапуск 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'а.
Теги:
сбой системы, Восстановление
Добавлено: 08 Апреля 2018 06:31:22 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...