以编程方式关闭TrayIcon Balloon

时间:2015-07-02 12:35:23

标签: delphi timer delphi-2009 trayicon balloon

是否可以通过编程方式关闭TTrayIcon气球提示?

问题:

我有一个计时器,每分钟检查一次邮件。当它发现一条消息(例如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分钟后回到PC(例如),他们将关闭第一条消息,然后托盘图标立即显示第二条消息,接下来的28条消息(用户不佳)也是如此。

我知道气球自动关闭,但只有当用户做一些输入(鼠标移动,按键,并且应用程序不需要聚焦甚至不可见)时它才会关闭。因此,如果用户远离计算机,则气球将永远保留在那里直到输入。

我尝试的其他解决方案是在显示任何气球时禁用Timer,并且仅在用户关闭当前气球(或它自动关闭)时再次启用它。但是我无法找到任何方法来发现气球何时关闭(如果用户点击X或者它自动关闭,OnBalloonClick事件就不会触发)。

1 个答案:

答案 0 :(得分:3)

NOTIFYICONDATA结构的引用介绍了如何在szInfo成员说明中隐藏气球提示:

  

要从用户界面中删除气球通知,请删除该图标   (使用NIM_DELETE)或在uFlags中设置NIF_INFO标志并将szInfo设置为   一个空字符串。

对于TTrayIcon组件(至少在您的Delphi版本中)很容易满足后一种选择,因为当TTrayIcon显示气球通知时,NIF_INFO标志已设置,因此剩下的就是将szInfo成员设置为空字符串。在TTrayIcon组件中,szInfo成员可以通过BalloonHint属性进行修改,因此要隐藏显示的气球提示,您只需编写:

TrayIcon.BalloonHint := '';