4

是否可以以编程方式关闭 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 条消息也是如此(可怜的用户)。

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

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

4

1 回答 1

3

NOTIFYICONDATA结构的参考描述了如何在szInfo成员描述中隐藏气球提示:

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

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

TrayIcon.BalloonHint := '';
于 2015-07-03T09:26:27.453 回答