如何手动更新托盘图标气球中的文本?

时间:2009-08-24 16:30:08

标签: delphi delphi-2009 tray

我使用的是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来更新文本,但它没有用。

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

1 个答案:

答案 0 :(得分:2)

只有在InitIcon为true时才会设置您的图标。将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的记录格式是MSDN网站上的documented以及shell_NotifyIcon调用。根据规范读取的内容,您应该能够传递与最初发送到更新相同的记录,因为这不起作用,您可能需要采取另一种方法。

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