Delphi应用程序托盘图标上的气球提示不断弹出

12

我有一个Delphi 2006应用程序,可以最小化到系统托盘图标,并通过托盘图标上的气球提示显示各种警报消息。

在某些情况下(我不知道什么时候),以前显示过的气球提示会持续弹出,而且无法消失。它会按编程长度显示,然后关闭,接着立即重新出现。

这总是来自该应用程序的气球提示。

如果应用程序显示另一个气球提示,则该提示将显示编程时间,然后幽灵提示恢复。

就好像提示被卡在某个队列中而没有被删除一样。如果没有任何启发性的人(我意识到这是一个很小的概率......),是否有人知道如何清除气球提示?


检查一下是否有一个定时器调用托盘图标来显示气泡提示,或者更好的方法是在整个项目中搜索托盘图标组件的名称,并查看您调用显示气泡提示的过程在哪里。 - user497849
@Dorin。谢谢,已经完成了。TTrayIcon的BalloonHint属性赋值的代码明显没有再次被调用。 - rossmcm
你是在Windows XP上测试吗?我记得在那个操作系统中,微软提供的气球存在一个漏洞。无论如何,请查看https://dev59.com/I0fRa4cB1Zd3GeqP_baI上的被接受的答案。我认为那可能会对你有所帮助。 - Guillem Vicens
这是你自己的应用吗?如果是,你能否发布代码以进行检查。仅凭你的解释而不看源代码,很难给出答案。 - HpTerm
2
你解决过这个问题吗?如果是的话,你应该把你的解决方案作为一个答案。 - Kenneth Cochran
仅供参考,因为它们都是WM_NOTIFY:https://dev59.com/A0jSa4cB1Zd3GeqPD0XC - HX_unbanned
2个回答

3
您正在使用哪个TrayIcon?在“Vcl.ExtCtrls”中的TCustomTrayIcon使用TNotifyIconData将弹出窗口发送到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;  

0

我在VB.NET中遇到了同样的问题。我的应用程序通过系统托盘中的气球提示显示错误消息。当一次出现多个错误时,气球提示会保持正常的超时时间,并逐个显示错误。看起来有一种缓冲区记住了您尝试显示气球提示的实际次数。如果您停止显示新的气球提示并等待足够长的时间,它最终会停止。

我的目标是在另一个气球提示出现时立即关闭当前的气球提示,但我还没有想出如何做到这一点。因此,这只是半个解决方案。


[添加完整解决方案]

完整的解决方案非常简单。在显示新的气球提示之前执行此操作(其中Tray是您的TrayIcon/NotifyIcon)。

Tray.Visible = true;

很难看出这与问题有什么关联,该问题涉及到一个Delphi应用程序。 - David Heffernan
这是解决同一个问题的方案,只是使用不同的代码。将我的一行代码翻译成Delphi代码,这对OP来说会有问题吗? - Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接