Всплывающие подсказки на значке на панели задач Delphi продолжают появляться бесконечно - PullRequest
11 голосов
/ 16 ноября 2010

У меня есть приложение Delphi 2006, которое может свернуть значок в трее и отображать различные предупреждающие сообщения с помощью всплывающей подсказки над значком в трее.

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

Это подсказка всегда отображается в этом приложении.

Если приложение отображает другую подсказку, это отображается длязапрограммированное время, затем фантомная подсказка возобновляется.

Это как если бы подсказка где-то застряла в очереди и не удалялась.В отсутствие кого-либо с каким-то вдохновением (я понимаю, что это длинный выстрел ...), кто-нибудь знает, как очистить подсказки воздушного шара?

Ответы [ 2 ]

2 голосов
/ 11 июня 2012

Какой 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;

Вы можете увидеть, что происходит, обработав сообщения, отправленные с помощью trayicon.

NIN_BALLOONSHOW      = WM_USER + 2;
NIN_BALLOONHIDE      = WM_USER + 3;
NIN_BALLOONTIMEOUT   = WM_USER + 4;
NIN_BALLOONUSERCLICK = WM_USER + 5;  
0 голосов
/ 24 октября 2014

Я сталкиваюсь с той же проблемой в VB.NET.Мое приложение показывает сообщения об ошибках через всплывающую подсказку в systray.Когда одновременно происходит несколько ошибок, всплывающая подсказка придерживается обычного времени ожидания и показывает ошибки одну за другой.Похоже, есть какой-то буфер, который запоминает фактическое количество раз, когда вы пытались показать всплывающую подсказку.Если вы перестанете показывать новые всплывающие подсказки и будете ждать достаточно долго, это в конечном итоге прекратится.

Моя цель - закрыть текущую всплывающую подсказку, как только появится другая, но я еще не решил сделать это.Так что это только половина решения.


[Добавлено полное решение]

Полное решение было очень простым.Сделайте это перед отображением новой всплывающей подсказки (где Tray - это ваш TrayIcon / NotifyIcon).

Tray.Visible = true;
...