1

我使用 CoolTrayIcon 组件,但我可以手动修改它。我想要完成的是更新我刚刚创建的气球中的文本,而不实际创建另一个气球。问题是:

function TCoolTrayIcon.ShowBalloonHint(Title: String; Text: String;
  IconType: TBalloonHintIcon; TimeoutSecs: TBalloonHintTimeOut): Boolean;
// Show balloon hint. Return false if error.
const
  aBalloonIconTypes: array[TBalloonHintIcon] of Byte =
    (NIIF_NONE, NIIF_INFO, NIIF_WARNING, NIIF_ERROR);
begin
  // Remove old balloon hint
  HideBalloonHint;
  // Display new balloon hint
  with IconData do
  begin
    uFlags := uFlags or NIF_INFO;
    StrLCopy(szInfo, PChar(Text), SizeOf(szInfo)-1);
    StrLCopy(szInfoTitle, PChar(Title), SizeOf(szInfoTitle)-1);
    TimeoutOrVersion.uTimeout := TimeoutSecs * 1000;
    dwInfoFlags := aBalloonIconTypes[IconType];
  end;
  Result := ModifyIcon;
  { Remove NIF_INFO before next call to ModifyIcon (or the balloon hint will
    redisplay itself) }
  with IconData do
    uFlags := NIF_ICON + NIF_MESSAGE + NIF_TIP;
end;

function TCoolTrayIcon.HideBalloonHint: Boolean;
// Hide balloon hint. Return false if error.
begin
  with IconData do
  begin
    uFlags := uFlags or NIF_INFO;
    StrPCopy(szInfo, '');
  end;
  Result := ModifyIcon;
end;

function TCoolTrayIcon.ModifyIcon: Boolean;
// Change icon or tooltip if icon already placed
begin
  Result := False;
  if InitIcon then
    Result := Shell_NotifyIcon(NIM_MODIFY, @IconData);
end;

我以为问题出在函数 HideBalloonHint,但我错了。我在 ShowBalloonHint 中评论了对 HideBalloonHint 的调用以更新文本,但它没有用。

问题:如何只更新托盘气球中的文本而不创建另一个气球?

4

1 回答 1

2

看来您的图标仅在 InitIcon 为真时才设置。将您的 modifyIcon 过程更改为:

function TCoolTrayIcon.ModifyIcon: Boolean;
// Change icon or tooltip if icon already placed
begin
  Result := Shell_NotifyIcon(NIM_MODIFY, @IconData);
end;

或在调用 ModifyIcon 之前将 InitIcon 设置为 true。

编辑——用于@IconData的记录格式与shell_NotifyIcon调用一起记录在 MSDN 网站上。从规范读取的内容来看,您应该能够传递与最初发送到更新相同的记录,因为这不起作用,您可能不得不采取另一种方法。

创建您“自己的”气球提示表单,并将其放置在您的任务图标上,然后直接更新它。这将消除多个气球窗口。

于 2009-08-24T17:02:38.783 回答