12 votes

Les astuces de ballons sur l'icône de la barre d'état du programme Delphi continuent de s'afficher indéfiniment

J'ai une application Delphi 2006 qui peut se réduire à une icône de la barre d'état système, et affiche divers messages d'alerte via une infobulle au-dessus de l'icône de la barre d'état système.

Dans certaines circonstances - je ne sais pas quand - une infobulle affichée précédemment continue de réapparaître et ne disparaît pas. Elle s'affiche pendant la durée programmée, se ferme, puis réapparaît immédiatement.

Il s'agit toujours d'une infobulle provenant de cette application.

Si l'application affiche une autre infobulle, celle-ci s'affiche pendant le temps programmé, puis l'infobulle fantôme reprend.

On dirait que l'infobulle est coincée dans une file d'attente quelque part et n'est pas supprimée. En l'absence de toute inspiration (je sais que c'est peu probable...), est-ce que quelqu'un sait comment purger les infobulles?

3voto

A1rPun Points 2995

Quel TrayIcon utilisez-vous? Le TCustomTrayIcon dans "Vcl.ExtCtrls" utilise TNotifyIconData pour envoyer le Popup au TrayIcon. Certaines propriétés nécessitent Windows Vista ou ultérieur.

public
  FData: TNotifyIconData; //Winapi.ShellAPI

procedure TCustomTrayIcon.ShowBalloonHint;
begin
  FData.uFlags := FData.uFlags or NIF_INFO;
  FData.dwInfoFlags := Cardinal(FBalloonFlags);
  Shell_NotifyIcon(NIM_MODIFY, FData); //Refresh(NIM_MODIFY);
end;

Vous pouvez voir ce qui se passe en manipulant les messages envoyés par le trayicon.

NIN_BALLOONSHOW      = WM_USER + 2;
NIN_BALLOONHIDE      = WM_USER + 3;
NIN_BALLOONTIMEOUT   = WM_USER + 4;
NIN_BALLOONUSERCLICK = WM_USER + 5;

0voto

Martin Points 705

Je rencontre le même problème en VB.NET. Mon application affiche des messages d'erreur via une infobulle dans la barre système. Lorsqu'il y a plusieurs erreurs en même temps, l'infobulle reste affichée pendant le délai normal et affiche les erreurs une par une. Il semble qu'il y ait une sorte de tampon qui se souvient du nombre réel de fois où vous essayez d'afficher l'infobulle. Si vous arrêtez d'afficher de nouvelles infobulles et attendez suffisamment longtemps, cela finira par s'arrêter.

Mon objectif serait de fermer l'infobulle actuelle dès qu'une autre arrive, mais je n'ai pas encore trouvé comment le faire. Donc ce n'est qu'une demi-solution.


[Solution complète ajoutée]

La solution complète était très simple. Faites ceci avant d'afficher une nouvelle infobulle (Où Tray est votre TrayIcon/NotifyIcon).

Tray.Visible = true;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X