2015-07-02 9 views
4

Можно ли программным путем закрыть подсказку шара 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 или он автоматически закрывается).

+7

'TrayIcon.BalloonHint: = '';' ([ '] (source' http://stackoverflow.com/a/902804/960757)) – TLama

+1

Я бы предложил игнорировать 'TTrayIcon' и вместо этого вызвать функцию Win32' Shell_NotifyIcon() '. Если ничего другого, это дает вам возможность получать сообщения «NIN_BALLOONSHOW», «NIN_BALLOONHIDE» и «NIN_BALLOONTIMEOUT». 'TTrayIcon' не предоставляет никаких событий для этих сообщений (хотя он обрабатывает' NIN_BALLOONHIDE' и 'NIN_BALLOONTIMEOUT' внутренне). В противном случае вы должны были бы получить от «TTrayIcon» и переопределить свой виртуальный метод «WindowProc()» для получения этих сообщений в вашем коде. –

+2

@TLama это работало как шарм. Пожалуйста, напишите как ответ, чтобы я мог его выбрать. Реми, у меня есть намерение делать то, что ты сказал, но, к сожалению, у меня нет знаний и времени для этого. Моя идея - создать класс для управления этими уведомлениями. Спасибо за то что делитесь Вашими идеями. – Alisson

ответ

3

Ссылка для NOTIFYICONDATA структуры описывает, как скрыть баллонной подсказку в описании szInfo члена:

Чтобы удалить уведомление воздушного шара из пользовательского интерфейса, либо удалить значок (с NIM_DELETE) или установить NIF_INFO в uFlags и установите szInfo в пустую строку.

Для TTrayIcon компонента (по крайней мере, в версии Delphi) легко встретить последний вариант, потому что, когда TTrayIcon показывает уведомление на воздушном шаре, то NIF_INFO флаг установлен, так что остается установка szInfo члена пустая строка. В TTrayIcon составляющей, szInfo элемент может быть изменен BalloonHint собственности, так, чтобы скрыть отображаемую на воздушном шаре подсказку вы можете просто написать:

TrayIcon.BalloonHint := ''; 

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

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