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で使用されるタイマーが、OSがユーザー入力を検出したときにのみ実行されるように設計されていることです。したがって、バルーンが消えるのを待っていて、実際には何もしていない場合は、タイムアウトすることはありません。

その理由は、PCを離れて、1時間後に戻ってきた場合でも、通知を見逃すことはないということだと思います。

それを回避する方法があります。それは、アイコンの表示を切り替える別のタイマーを実行することです。

例えば:

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 に答える