Всплывающие подсказки на значке на панели задач 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;
Другие вопросы по тегам