我有一个 Delphi 2006 应用程序,它可以最小化为托盘图标,并通过托盘图标上的气球提示显示各种警报消息。
在某些情况下——我不知道什么时候——之前显示的气球提示会不断弹出并且不会消失。它显示编程的时间长度,关闭,然后立即重新出现。
这个应用程序始终是一个气球提示。
如果应用程序显示另一个气球提示,该提示在编程的时间内显示,则幻影提示会继续。
就好像提示卡在某处的队列中并且没有被删除。在没有任何人有灵感的情况下(我意识到这是一个长镜头......),有人知道如何清除气球提示吗?
我有一个 Delphi 2006 应用程序,它可以最小化为托盘图标,并通过托盘图标上的气球提示显示各种警报消息。
在某些情况下——我不知道什么时候——之前显示的气球提示会不断弹出并且不会消失。它显示编程的时间长度,关闭,然后立即重新出现。
这个应用程序始终是一个气球提示。
如果应用程序显示另一个气球提示,该提示在编程的时间内显示,则幻影提示会继续。
就好像提示卡在某处的队列中并且没有被删除。在没有任何人有灵感的情况下(我意识到这是一个长镜头......),有人知道如何清除气球提示吗?
您使用的是哪个 TrayIcon?"Vcl.ExtCtrls" 中的 TCustomTrayIcon 使用 TNotifyIconData 将 Popup 发送到 TrayIcon。某些属性需要 Windows Vista 或更高版本。
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;
您可以通过处理托盘图标发送的消息来查看发生了什么。
NIN_BALLOONSHOW = WM_USER + 2;
NIN_BALLOONHIDE = WM_USER + 3;
NIN_BALLOONTIMEOUT = WM_USER + 4;
NIN_BALLOONUSERCLICK = WM_USER + 5;
我在 VB.NET 中面临同样的问题。我的应用程序通过系统托盘中的气球提示显示错误消息。当一次出现多个错误时,气球提示会坚持正常超时并一个接一个地显示错误。看起来有某种缓冲区可以记住您尝试显示气球提示的实际次数。如果您停止显示新的气球提示并等待足够长的时间,它最终会停止。
我的目标是在另一个气球进入时立即关闭当前的气球提示,但我还没有想出这样做。所以这只是解决方案的一半。
[添加完整解决方案]
完整的解决方案非常简单。在显示新的气球提示之前执行此操作(其中 Tray 是您的 TrayIcon/NotifyIcon)。
Tray.Visible = true;