4

我以一种相当简单的方式使用 NotifyIcon。

public class Popup
{
    ...
    private static NotifyIcon ni;

    static Popup()
    {
        ni = new NotifyIcon();
        ni.Icon = SystemIcons.Information;
    }

    public Popup(string nexusKey)
    {
        ...
    }

    public void make(string text)
    {
        try
        {
           ...
        }
        catch
        {
            ni.Visible = true;
            ni.ShowBalloonTip(1000, "Thats the title", text, ToolTipIcon.Info);
        }

    }
}

问题是,如果我关注的窗口与托管显示气球的进程的窗口不同,那么“保持活力”计时器似乎不会启动。关于如何确保气球在 1 秒后消失的任何想法?

4

1 回答 1

4

这种行为的部分原因是 ShowBalloonToolTip 中使用的计时器被设计为仅在操作系统检测到用户输入时运行。因此,如果您只是在等待气球消失而不实际做任何事情,那么它永远不会超时。

我相信原因是如果你离开你的电脑并在一个小时后回来,那么你就不会错过任何通知。

有一种解决方法,那就是运行一个单独的计时器来切换图标的可见性。

例如:

private void ShowBalloonWindow(int timeout)
        {
            if (timeout <= 0)
                return;

            int timeoutCount = 0;
            trayIcon.ShowBalloonTip(timeout);

            while (timeoutCount < timeout)
            {
                Thread.Sleep(1);
                timeoutCount++;
            }

            trayIcon.Visible = false;
            trayIcon.Visible = true;
        }

编辑

啊,是的——我把它拼凑在一起,没有考虑你是如何使用它的。如果您希望异步运行它,那么我建议您将计时器放在工作线程中,Invokes该方法是在完成时切换trayIcon.Visible属性的方法。

于 2011-11-23T13:05:25.273 回答