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 に戻った場合 (たとえば)、最初のメッセージを閉じると、すぐにトレイ アイコンに 2 番目のメッセージが表示され、次の 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 に答える