Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   TTrayicon.BalloonHint entfernen (https://www.delphipraxis.net/215406-ttrayicon-balloonhint-entfernen.html)

kmma 26. Jun 2024 17:17

TTrayicon.BalloonHint entfernen
 
Wenn ich einen TTrayIcon.Balloonhint mit
Delphi-Quellcode:
  TrayIcon1.BalloonHint := 'This is a Balloon Hint';
  TrayIcon1.BalloonTitle := 'Hint Title';
  TrayIcon1.ShowBalloonHint;
anzeige, wie bekomme ich den zuverlässig wieder weg (außer warten bis das Timeout erreicht ist)?

wenn ich mit

Delphi-Quellcode:
  TrayIcon1.BalloonHint := '';
  TrayIcon1.BalloonTitle := '';
  TrayIcon1.ShowBalloonHint;
den BalloonHint mit einem leeren Hint überschreibe geht das beim ersten mal gut, wenn ich dann aber einen neuen Hint anzeigen will kommt dieser sehr start verzögert oder lässt sich auf die gleiche Art und Weise nicht mehr vorzeitig entfernen.

himitsu 26. Jun 2024 17:58

AW: TTrayicon.BalloonHint entfernen
 
In der VCL-Klasse is halt nix für drin.
Aber schau doch mal, ob du bei Windows was findest?

MSDN-Library durchsuchenShell_NotifyIcon und NIN_BALLOONHIDE klang nett.

Nja, dann noch der Spaß, dass die Klasse bissl scheiße designt ist.



Hab mal was versucht ... half aber noch nix.
Delphi-Quellcode:
uses
  ...
  Winapi.ShellAPI;

type
  TTrayIcon = class(Vcl.ExtCtrls.TTrayIcon);

type
  TForm27 = class(TForm)
    TrayIcon1: TTrayIcon;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

...

procedure TForm27.Button1Click(Sender: TObject);
var
  Data: TNotifyIconData;
begin
  TrayIcon1.BalloonHint := 'This is a Balloon Hint';
  TrayIcon1.BalloonTitle := 'Hint Title';
  TrayIcon1.ShowBalloonHint;
  Application.ProcessMessages;
  Sleep(2000);

  Data := TrayIcon1.Data;
  Data.uFlags := Data.uFlags and not NIF_INFO;
  //Shell_NotifyIcon(NIM_MODIFY, @Data);
  Shell_NotifyIcon(NIN_BALLOONHIDE, @Data);
end;

Uwe Raabe 26. Jun 2024 18:12

AW: TTrayicon.BalloonHint entfernen
 
Kannst du das mit einem simplen Testprogramm reproduzieren? Ich konnte das hier unter D12.1 jedenfalls nicht.

Uwe Raabe 26. Jun 2024 18:17

AW: TTrayicon.BalloonHint entfernen
 
Zitat:

Zitat von himitsu (Beitrag 1538274)
NIN_BALLOONHIDE

Das wird aber nur von Windows als Notification an die Application wenn der Balloon verschwindet. Es ist keine Message um das zu steuern.

Der korrekte Weg ist das BalloonHint Property einfach leer zu setzen. Den nachfolgenden ShowBalloonHint-Aufruf kann man sich sparen. Übrigens auch das Leeren des BalloonTitle.

himitsu 26. Jun 2024 18:20

AW: TTrayicon.BalloonHint entfernen
 
Ahhh stimmt, jetzt gesehn ... NIN und nicht MIM :wall: ... hatte mich schon bissl geundert, aber versuchen kann man's ja dennoch mal :stupid:

Der erste Versuch war NIM_MODIFY und dort NIF_INFO zu entfernen ... durch Setzen dieses Flags wurde vorher im ShowBalloonHint der Hint sichtbar.

kmma 27. Jun 2024 08:50

AW: TTrayicon.BalloonHint entfernen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1538277)
Zitat:

Zitat von himitsu (Beitrag 1538274)
NIN_BALLOONHIDE

Das wird aber nur von Windows als Notification an die Application wenn der Balloon verschwindet. Es ist keine Message um das zu steuern.

Der korrekte Weg ist das BalloonHint Property einfach leer zu setzen. Den nachfolgenden ShowBalloonHint-Aufruf kann man sich sparen. Übrigens auch das Leeren des BalloonTitle.


Hmmm, das kann ich so nicht nachvollziehen.

(Delphi 12.1) Ich habe mir 2 Buttons auf ein Formular gezogen und folgenden Code eingefügt:


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  TrayIcon1.BalloonHint := 'This is a Balloon Hint ' + formatdatetime('hh:mm:ss.zzz', now);
  TrayIcon1.BalloonTitle := 'Hint Title';
  TrayIcon1.ShowBalloonHint;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  TrayIcon1.BalloonHint := '';
end;

Jetzt klickt man 5 mal abwechselnd (im Sekundentakt) auf Button1 und Button2. Der erste Hint verschwindet noch wenn man Button2 klickt. Dann kommen aber nach jeweils ca. 10 Sekunden die restlichen Hints (mit einem Zeitstempel der ca. eine Sekunde auseinander liegt).
Da wird also scheinbar nicht gelöscht sondern eine Warteschlange angelegt.

Uwe Raabe 27. Jun 2024 10:02

AW: TTrayicon.BalloonHint entfernen
 
Komisch, nun kann ich das von dir beschriebene Verhalten aber nicht nachvollziehen. Also, ich klicke auf Button1, dann auf nach ca. 1 Sekunde Button2, damn wieder auf Button1 usw.

Es werden zwar sporadisch zwischendurch mal die Lösch-Klicks ignoriert. Aber in der Regel verschwindet der Hint beim Klick auf Button2 sofort.

Dummerweise kann ich kein Video davon machen, denn während der Aufnahme werden die Popups leider unterdrückt.

Ach ja, Windows 10 Pro Build 19045

kmma 27. Jun 2024 11:01

AW: TTrayicon.BalloonHint entfernen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1538299)
Komisch, nun kann ich das von dir beschriebene Verhalten aber nicht nachvollziehen. Also, ich klicke auf Button1, dann auf nach ca. 1 Sekunde Button2, damn wieder auf Button1 usw.

Es werden zwar sporadisch zwischendurch mal die Lösch-Klicks ignoriert. Aber in der Regel verschwindet der Hint beim Klick auf Button2 sofort.

Dummerweise kann ich kein Video davon machen, denn während der Aufnahme werden die Popups leider unterdrückt.

Ach ja, Windows 10 Pro Build 19045

Das Problem scheint tatsächlich nur bei Windows 11 aufzutreten, der gleiche Code funktioniert unter Windows 10 einwandfrei.

Also konkretisiere ich die Frage: Wie entfernt man einen BalloonHint unter Windows 11 sauber?


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz