Можно ли программным путем закрыть подсказку шара TTrayIcon?Close TrayIcon Balloon Programmatically
Проблема:
У меня есть таймер, который проверяет наличие сообщений каждую минуту. Когда он обнаруживает сообщение (., Например, ABC служба остановлена), он показывает всплывающее окно с сообщением:
procedure TFrmTest.tmrTimer(Sender: TObject);
begin
tmr.Enabled := False;
try
if IsAnyServiceStopped then
ShowBallon(bfError, 'The ABC Service is stopped. Do something!!!');
finally
tmr.Enabled := True;
end;
end;
procedure TfrmTest.ShowBallon(pFlag: TBalloonFlags; pMessage: string);
begin
try
// HERE I'D LIKE TO CLOSE THE BALLOON IF IT'S OPENNED
TrayIcon.BalloonFlags := pFlag;
TrayIcon.BalloonHint := pMessage;
TrayIcon.ShowBalloonHint;
except
end;
end;
TrayIcon BalloonTimeOut установлен в 3000 (3 секунды). Поскольку таймер запускает сообщение каждую минуту (когда есть какое-либо сообщение), если пользователь не закрывает его, система создает очередь сообщений. Если пользователь вернется на ПК через 30 минут (например), они закроют первое сообщение, а затем значок в трее отобразит второе сообщение и то же самое для следующих 28 сообщений (плохой пользователь).
Я знаю, что воздушный шар автоматически закрывается, но он закрывается, только если пользователь делает какой-либо ввод (движение мыши, нажатие клавиши и приложение не нужно фокусировать или даже видеть). Поэтому, если пользователь находится далеко от компьютера, баллон остается там навсегда до входа.
Другое решение, которое я пытался, было отключить Таймер при отображении любого шара и включить его снова, только когда пользователь закрывает текущий воздушный шар (или он автоматически закрывается). Но я не мог найти способ узнать, когда воздушный шар закрыт (событие OnBalloonClick не срабатывает, если пользователь нажимает на X или он автоматически закрывается).
'TrayIcon.BalloonHint: = '';' ([ '] (source' http://stackoverflow.com/a/902804/960757)) – TLama
Я бы предложил игнорировать 'TTrayIcon' и вместо этого вызвать функцию Win32' Shell_NotifyIcon() '. Если ничего другого, это дает вам возможность получать сообщения «NIN_BALLOONSHOW», «NIN_BALLOONHIDE» и «NIN_BALLOONTIMEOUT». 'TTrayIcon' не предоставляет никаких событий для этих сообщений (хотя он обрабатывает' NIN_BALLOONHIDE' и 'NIN_BALLOONTIMEOUT' внутренне). В противном случае вы должны были бы получить от «TTrayIcon» и переопределить свой виртуальный метод «WindowProc()» для получения этих сообщений в вашем коде. –
@TLama это работало как шарм. Пожалуйста, напишите как ответ, чтобы я мог его выбрать. Реми, у меня есть намерение делать то, что ты сказал, но, к сожалению, у меня нет знаний и времени для этого. Моя идея - создать класс для управления этими уведомлениями. Спасибо за то что делитесь Вашими идеями. – Alisson