Восстановление иконки в системном трее после падения explorer.exe
Бывает, что очень маленькие и полезные программы помещают свою иконку в область уведомлений (системный трей), и в принципе, все идет хорошо, до того момента, пока не порушится explrer.exe, а такое с ним хоть и редко, но случается.
После такой неприятности, программа вроде бы и висит в памяти, и даже что-то делает (например как моя микроутилита показывающая температуру в Усть-Каменогорске), но иконка уже не отображается. При этом видно, что некоторые другие программы восстановили свои иконки сразу же при автоматическом запуске explorer.exe. Долгое время руки не доходили заняться этим вопросом, но теперь я знаю как восстановить иконку в трее после падения explorer.exe.
Все оказалось довольно просто. И об этом на сайте MSDN есть подробная информация. Оказывается, что при создании таскбара (и, следовательно системного трея) создается сообщение, которое отправляется всем окнам верхнего уровня. Сообщение называется “TaskbarCreated”, его нужно добавить в свою программу с помощью функции RegisterWindowMessage, которая возвращает существующий номер сообщения, уже зарегистрированного в системе. “TaskbarCreated” как раз такое сообщение.
После чего нужно просто проверять это сообщение в своей программе, и при его получении заново размещать иконку в трее.
В общем, нужно добавить совсем немного в функцию основного окна.
Выглядит это примерно так:
LRESULT CALLBACK WindowFunc ( HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam )
{
static UINT MessageTaskbarCreated;
switch(umsg)
{
case WM_CREATE:
MessageTaskbarCreated = RegisterWindowMessage("TaskbarCreated");
break;
default:
if ( umsg == MessageTaskbarCreated )
AddTrayIcon();
break;
}
return DefWindowProc(hwnd, umsg, wparam, lparam);
}