Имеется программа, тихо висящая в фоне, без окон, только со значком (временами несколькими, через Shell_NotifyIcon создаваемыми-убиваемыми) в трее.
Но при перезапуске проводника (ну, например, сбой какой) эти иконки не восстанавливаются.
Подскажите, как корректно организовать при перезапуске проводника перезапуск :) своих иконок в трее?
Ответ
Подпишитесь на событие TaskbarCreated. Оно вызывается каждый раз при создании связки «Меню «Пуск» — Панель быстрого запуска — Панель задач — Панель уведомлений»; из неё нас интересует только последний пункт.
Объявите где-нибудь глобальную переменную для хранения идентификатора оконного сообщения, соответствующего имени «TaskbarCreated»
static UINT _uTaskbarRestartMessage;
Где-нибудь при инициализации приложения необходимо выполнить собственно подписку:
_uTaskbarRestartMessage = RegisterWindowMessage(TEXT("TaskbarCreated"));
При получении оконного сообщения с uMsg, равным значению _uTaskbarRestartMessage, необходимо пересоздать все необходимые значки своего приложения так, как мы делали это первый раз при запуске приложения:
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(uMsg)
{
// ...
default:
if(uMsg == _uTaskbarRestartMessage)
{
// Создаём иконки в панели уведомлений
return 0;
}
else
return DefWndProc(hwnd, uMsg, wParam, lParam);
}
}
Комментариев нет:
Отправить комментарий