Как обновить текст в трее на значке всплывающей подсказки вручную? - PullRequest
1 голос
/ 24 августа 2009

Я использую компонент 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, но я ошибся. Я прокомментировал вызов HideBalloonHint в ShowBalloonHint в другом для обновления текста, но это не сработало.

Вопрос: Как обновить только текст в всплывающей подсказке без создания другого всплывающей подсказки?

1 Ответ

2 голосов
/ 24 августа 2009

Похоже, что ваш значок установлен, только если InitIcon имеет значение true. Измените вашу процедуру modifyIcon следующим образом:

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

или установите InitIcon в true перед вызовом ModifyIcon.

EDIT - Формат записи, используемый для @IconData, задокументирован на веб-сайте MSDN вместе с вызовом shell_NotifyIcon . Из того, что прочитано в спецификациях, вы сможете передавать ту же запись, что и оригинал, отправленный для обновления, поскольку это не работает, возможно, вам придется использовать другой подход.

Создайте свою «собственную» форму подсказки, поместите ее поверх значка задачи и обновите ее напрямую. Это устранит несколько окон с воздушными шарами.

...