@Che_Bu_Rashka

Как отследить событие что-то типа «Трей создается»?

Моё приложение запускается службой и при запуске добавляет иконку в системный трей. Проблема в том, что если пользователь не сразу вошел в систему (долго вводил пароль) приложение хоть и запускается службой, но без значка в трее, его еще не существовало, когда ПО пыталось создать иконку.
Также наблюдается такой недостаток: если в диспетчере задач "убить" процесс Explorer.exe, а затем там же создать новый, то все значки в трее восстанавливаются, а мой нет. По всему видно нужно отловить какое-то событие типа "Трей Создается" и при возникновении оного реагировать, добавляя свою иконку. Собственно вопрос: что за событие и как отреагировать? (Win 7 & Win XP)
  • Вопрос задан
  • 143 просмотра
Пригласить эксперта
Ответы на вопрос 2
@dude2012
Мониторить хэндл окна таскабара и трея. Раз в минуту или 30 секунд. Тупо, но не особо ресурсоёмко. Если хэндл сменился , то добавить иконку.

function TaskbarHandle: THandle;
begin
Result := FindWindow('Shell_TrayWnd', nil);
end;

function TrayHandle: THandle;
begin
Result := FindWindowEx(TaskbarHandle, 0, 'TrayNotifyWnd', nil);
end;
Ответ написан
@Che_Bu_Rashka Автор вопроса
//ловим событие  WM_TaskbarCreated
procedure TmwdForm.WndProc(var msg: TMessage);
begin
  inherited;
  if msg.Msg = WM_TaskbarCreated then
    <что-то делаем>
end;

...
...
initialization
  WM_TASKBARCREATED := RegisterWindowMessage('TaskbarCreated');

end.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы