Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

Какой TrayIcon вы используете? TCustomTrayIcon в "Vcl.ExtCtrls" использует TNotifyIconData для отправки Popup в 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;

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

NIN_BALLOONSHOW      = WM_USER + 2;
NIN_BALLOONHIDE      = WM_USER + 3;
NIN_BALLOONTIMEOUT   = WM_USER + 4;
NIN_BALLOONUSERCLICK = WM_USER + 5;  

Ответ 2

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

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


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

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

Tray.Visible = true;