Значок в системном трее не появляется при запуске - PullRequest
4 голосов
/ 07 декабря 2009

Я использую следующий код в обработчике событий FormCreate для создания иконки в системном трее. Когда я запускаю свою программу, иконка в системном трее появляется нормально.

Я установил, чтобы мое приложение запускалось автоматически при запуске Windows. Когда я перезагружаю компьютер, процесс моего приложения запускается, но значок на панели задач никогда не появляется.

Я думаю, что это может быть связано со временем запуска кода, что, возможно, системный трей не готов к заполнению.

При запуске приложения я запускаю его через установщик NSIS: WriteRegStr HKLM "Программное обеспечение \ Microsoft \ Windows \ CurrentVersion \ Run" "MyApp" "$ INSTDIR \ MyApp.exe"

Код для создания иконки в системном трее:

with TrayIconData do
  begin
    cbSize := SizeOf(TrayIconData);
    Wnd := Handle;
    uID := 0;
    uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
    uCallbackMessage := WM_ICONTRAY;
    hIcon := Application.Icon.Handle;
    StrPCopy(szTip, Application.Title);
  end;

  Shell_NotifyIcon(NIM_ADD, @TrayIconData);

Ответы [ 2 ]

1 голос
/ 07 декабря 2009

Вы пытаетесь создать иконку до полного запуска Explorer. Вы должны корректно обрабатывать ошибки (прокрутите вниз до "Обработка ошибки Shell_NotifyIcon").

Вам также следует обработать уведомление TaskbarCreated - оно позволяет вам воссоздавать значки после аварийного завершения работы и перезапуска.

0 голосов
/ 07 декабря 2009

Проблема возникла из-за того, что текущий каталог при запуске не является каталогом, в котором находится исполняемый файл.

Таким образом, getCurrentDir фактически возвращал разные каталоги при запуске и при запуске приложения в любое другое время.

Мое приложение делало плохое предположение, что текущим каталогом будет тот, в котором находится исполняемый файл.

Это предположение заставляло приложение никогда не достигать иконки в трее, добавляя код вообще. Как только я исправил проблему с каталогом, код запустился и правильно создал иконку.

...