Значок подноса системы не появляется на стартапе
-
13-09-2019 - |
Вопрос
Я использую следующий код в обработчике событий FormCreate, чтобы создать значок системного лотка. Когда я запускаю свою программу, значок системного лотка выглядит нормально.
Я установил, что мое приложение будет запущено автоматически при запуске Windows. Когда я перезагружаю компьютер, процесс моего приложения начинается, но значок системного лотка никогда не появляется.
Я думаю, что это может быть связано с временем, когда код запускается, возможно, системный лоток не готов к заполнению.
Я заставляю свое приложение запустить в запуске через его установщик NSIS: WritereGstr HKLM "Software 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);
Решение
Вы пытаетесь создать значок до того, как Explorer полностью начал. Вам следует обрабатывать ошибки изящно (Прокрутите вниз до «Обработка shell_notifyicon сбой»).
Вы также должны справиться Уведомление о графиках задач - Это позволяет вам воссоздать свои значки после сбоев исследователя и перезапуска.
Другие советы
Проблема была вызвана тем, что текущий каталог во время запуска не является каталогом, в котором исполняется исполняемый файл.
Таким образом, GetCurrentDir фактически возвращал разные каталоги в стартапе, и когда приложение было запущено в любое другое время.
Моим заявлением было плохое предположение, что текущий DIR будет тем, в котором проживает исполняемый файл.
Это предположение заставляло приложение никогда не достигать значка лотка, добавляя код вообще. Как только я исправил проблему каталога, код запустил и правильно создал значок.