2010-11-16 11 views
11

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

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

Это всегда воздушный шар из этого приложения.

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

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

+0

проверить, если у вас есть таймер, который вызывает значок на панели задач, чтобы отобразить шар или еще лучше искать весь проект по имени компонента иконки в трее и увидеть, где вы вызвать процедуру, которая показывает воздушный шар. – ComputerSaysNo

+0

@Dorin. Спасибо, сделал это. Код, который присваивает свойству BalloonHint TTrayIcon, определенно не называется снова. – rossmcm

+0

Вы тестируете это на Windows XP? Кажется, я помню, что была ошибка с шарами, предоставленными MS на этой ОС. В любом случае, проверьте принятый ответ на странице http://stackoverflow.com/questions/902642/how-to-hide-a-taskbar-balloon-at-will. Я думаю, это может вам помочь. –

ответ

2

Какой ты тип 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; 
0

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

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


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

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

Tray.Visible = true; 
+0

Трудно понять, как это относится к вопросу касавшегося Delphi application –

+0

Это решение для той же проблемы. Только в другом коде.Переведите мою одну строку кода в код Delphi. Будет ли это проблемой для ОП? – Martin

 Смежные вопросы

  • Нет связанных вопросов^_^