【问题标题】:How can I tell if a Balloon tip in the system tray has closed?如何判断系统托盘中的气球提示是否已关闭?
【发布时间】:2010-10-29 17:58:19
【问题描述】:

我有一个应用程序,它使用托盘中的 NotifyIcon 来隐藏/恢复应用程序,以及向用户弹出应用程序事件的通知。我的应用程序有一个通知队列,我使用 NotificationIcon.BalloonTipClosed 事件来确定何时重置气球并显示下一个通知(如果队列中有通知)。

此方法似乎在两种常见原因中都有效(用户让气球在超时时自行关闭,并且用户在气球中单击“X”以强制其关闭),但还有第三种情况 BalloonTipClosed 没有被调用:

  1. 弹出通知气球
  2. 当它可见时,用户右键单击通知图标以调出上下文菜单,导致气球消失

在这种情况下,BalloonTipClosed 事件不会被触发 - 我认为这是框架中的一个错误(我使用的是 2.0),但有人对此有想法吗?如果我没有收到这个事件,我的应用程序总是认为有一个可见的气球(我有一个布尔值,可以防止它一次显示多个气球),并且它永远不会再显示另一个图标,只要它正在运行。

【问题讨论】:

    标签: vb.net notifyicon balloon


    【解决方案1】:

    在 BalloonTipClicked 事件的事件处理程序中,我会检查是否单击了鼠标右键,以及是否将布尔值设置为 false。

    【讨论】:

      【解决方案2】:

      这就是我最终做的,虽然我不是特别喜欢这个解决方案。我在表单中添加了第二个计时器并将其设置为 10 秒。当弹出通知时(当我弹出一个通知时),我启动计时器,然后在 BalloonTipClosed 中停止它。如果计时器计时(意味着 BalloonTipClosed 尚未运行),我会手动显示下一个提示。

      结果是,如果它还没有触发,我会处理它。但是,如果有人有更好的解决方案,我愿意接受。

      【讨论】:

        【解决方案3】:

        这属于对 Aarons 答案的评论,但我还不能发表评论。

        如果您处理 NotifyIcon(以及 BalloonTipClosed)上的 BalloonTipClicked 和 MouseClick 事件,那么您可以捕获气球可以关闭的所有方式。唯一需要注意的是,几个场景会触发多个事件,所以一定要围绕它编写代码(比如 isClosed = true,然后在显示新气球时重置它)。

        【讨论】:

        • 这个问题是,虽然我可以捕获 icon_click 事件,并且我知道气球已经关闭,但我不确定何时显示下一个气球。立即显示它会覆盖用户在那里所做的任何事情。我可以在单击后延迟执行此操作,但这仍然涉及计时器,因此我宁愿在所有情况下都使用计时器。
        • 好点。假设用户唯一可以“在那里做的事情”是激活上下文菜单,如果您处理菜单打开和关闭事件,并且如果上下文菜单没有被激活,则仅显示下一个气球。您可能还想根据用户选择的菜单项做出决定
        【解决方案4】:

        我认为 Raymond Chen 的这篇关于气球通知的帖子可能会对您有所帮助: http://blogs.msdn.com/oldnewthing/archive/2009/05/04/9585032.aspx

        【讨论】:

        • 我认为这正是发生在我身上的事情,但 Raymond 同意确实没有办法判断气球是否已关闭。在我看来,如果气球以任何方式关闭,BalloonTipClosed 事件应该触发,但如果您通过单击 NotifyIcon 关闭气球,它不会触发,我认为它应该如此。也许我会升级我的应用程序的框架版本,看看这是否会改变行为。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多