2011-11-23 12 views
4

我以相當簡單的方式使用NotifyIcon。C#NofityIcon氣球提示並不總是在指定時間內消失

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

此行爲的部分原因是,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; 
     } 

編輯

是啊 - 我鵝卵石一起沒有想到你是如何使用它。 如果你希望異步運行,那麼我建議你將定時器放在一個工作線程中,該工作線程完成後可以切換trayIcon.Visible屬性。

+0

謝謝Chirs,這是所期望的效果。但是,我的應用程序在幾次泡泡後變得不穩定。也許因爲這畢竟是同步的? – Jerome

+0

嘗試在使用委託或方法使用Invoke更改圖標可見性的工作線程中運行計時器。 – ChrisBD

+1

對於Windows 7似乎是正確的(氣球提示一直保留到用戶輸入爲止),但不適用於Windows 10,所以我想這也是操作系統特定的。 –