我以相当简单的方式使用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秒后消失的任何想法,无论如何?
答案 0 :(得分: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
属性。