Всплывающие подсказки на значке на панели задач Delphi продолжают появляться бесконечно
У меня есть приложение Delphi 2006, которое может свернуть значок в трее и отображать различные предупреждающие сообщения с помощью всплывающей подсказки над значком в трее.
При некоторых обстоятельствах - я не знаю, когда - ранее отображавшаяся подсказка всплывающего окна появляется и не исчезает. Он отображается на запрограммированное время, закрывается, а затем снова появляется.
Это всегда подсказка из этого приложения.
Если приложение отображает другую подсказку, отображаемую в течение запрограммированного времени, подсказка-фантом возобновляется.
Как будто подсказка где-то застряла в очереди и не удаляется. В отсутствие кого-то с каким-то вдохновением (я понимаю, что это длинный выстрел...), кто-нибудь знает, как очистить подсказки воздушного шара?
2 ответа
Какой TrayIcon вы используете? TCustomTrayIcon в "Vcl.ExtCtrls" использует TNotifyIconData для отправки всплывающего окна в TrayIcon. Для некоторых свойств требуется Windows Vista или более поздняя версия.
public
FData: TNotifyIconData; //Winapi.ShellAPI
procedure TCustomTrayIcon.ShowBalloonHint;
begin
FData.uFlags := FData.uFlags or NIF_INFO;
FData.dwInfoFlags := Cardinal(FBalloonFlags);
Shell_NotifyIcon(NIM_MODIFY, FData); //Refresh(NIM_MODIFY);
end;
Вы можете увидеть, что происходит, обработав сообщения, отправленные с помощью traicicon.
NIN_BALLOONSHOW = WM_USER + 2;
NIN_BALLOONHIDE = WM_USER + 3;
NIN_BALLOONTIMEOUT = WM_USER + 4;
NIN_BALLOONUSERCLICK = WM_USER + 5;
Я сталкиваюсь с той же проблемой в VB.NET. Мое приложение показывает сообщения об ошибках через всплывающую подсказку в systray. Когда одновременно происходит несколько ошибок, всплывающая подсказка придерживается обычного времени ожидания и показывает ошибки одну за другой. Похоже, что существует какой-то буфер, который запоминает фактическое количество попыток показать всплывающую подсказку. Если вы перестанете показывать новые всплывающие подсказки и будете ждать достаточно долго, это в конечном итоге прекратится.
Моя цель - закрыть текущую всплывающую подсказку, как только появится другая, но я пока не решил сделать это. Так что это только половина решения.
[Добавлено полное решение]
Полное решение было очень простым. Сделайте это, прежде чем показывать новую всплывающую подсказку (где Tray - это ваш TrayIcon/NotifyIcon).
Tray.Visible = true;