12

私は .Net 3.5 C# Winforms アプリを持っています。GUI 自体はなく、ContextMenu を備えた NotifyIcon だけです。

次のように、NotifyIcon を visible=false に設定し、Application_Exit イベントで破棄しようとしました。

        if (notifyIcon != null)
        {
            notifyIcon.Visible = false;
            notifyIcon.Dispose();
        }

アプリは括弧内のコードに到達しますが、Visible = false を設定しようとすると null ref 例外がスローされます。

フォームを閉じるイベントに入れるためにいくつかの場所を読んだことがありますが、そのコードは決してヒットしません (フォームがそのように表示されていないためでしょうか?)。

実際に機能するように、このコードをどこに置くことができますか? 入れないと、マウスをその上に移動するまで、迷惑なアイコンがトレイに残ります。

乾杯。

編集

私が気づいた余分な何か........

アプリで ClickOnce を使用しています.........NotifyIcon の ContextMenu からアプリを終了すると、例外はログに記録されません。

ここでアプリケーションがアップグレードをチェックした後、Application_Exit イベントが発生したとき..

private void CheckForUpdate()
{
    EventLogger.Instance.LogEvent("Checking for Update");
    if (ApplicationDeployment.IsNetworkDeployed && ApplicationDeployment.CurrentDeployment.CheckForUpdate())
    {
        EventLogger.Instance.LogEvent("Update available - updating");
        ApplicationDeployment.CurrentDeployment.Update();
        Application.Restart();
    }
}

これは役に立ちますか?

4

7 に答える 7

12

Windows 7 では、Icon プロパティも null に設定する必要がありました。そうしないと、アプリケーションを閉じた後、アイコンがトレイの「隠しアイコン」ポップアップに残りました。HTH誰か。

// put this inside the window's class constructor
Application.ApplicationExit += new EventHandler(this.OnApplicationExit);


        private void OnApplicationExit(object sender, EventArgs e)
        {

            try
            {
                if (trayIcon != null)
                {
                    trayIcon.Visible = false;
                    trayIcon.Icon = null; // required to make icon disappear
                    trayIcon.Dispose();
                    trayIcon = null;
                }

            }
            catch (Exception ex)
            {
                // handle the error
            }
        }
于 2010-11-21T16:16:49.520 に答える
4

このコードは私にとってはうまくいきますが、あなたがどのようにアプリケーションを存続させているのかわかりません。

using System;
using System.Drawing;
using System.Windows.Forms;

static class Program
{
    static System.Threading.Timer test = 
        new System.Threading.Timer(Ticked, null, 5000, 0);

    [STAThread]
    static void Main(string[] args)
    {
        NotifyIcon ni = new NotifyIcon();
        ni.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);
        ni.Visible = true;

        Application.Run();
        ni.Visible = false;
    }

    static void Ticked(object o) {
        Application.Exit();
    }
}
于 2009-07-01T08:08:29.290 に答える
3

これは私がWPFでやっていることです。

これを David Anson のMinimize totray sample appと組み合わせて使用​​しています。これにより、トレイ アイコンをウィンドウに接続できます (複数のウィンドウが開いている場合があります)。

このコードを のコンストラクターに追加しましたMinimizeToTrayInstance

_window.Closed += (s, e) => 
{
        if (_notifyIcon != null)
        {
            _notifyIcon.Visible = false;
            _notifyIcon.Dispose();
            _notifyIcon = null;
        }
};
于 2010-10-01T00:41:21.037 に答える
0

notifyIconを初期化したオブジェクトのdisposeメソッドをオーバーライドして、notifyIconも破棄しましたか?

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        notifyIcon.Dispose();
        notifyIcon = null;
    }
    base.Dispose(disposing);
}
于 2011-11-03T12:09:41.063 に答える
0

このコードは私のために働いた

this.Closed += (a, b) =>
            {
                if (notifyIcon1 != null)
                {
                    notifyIcon1.Dispose();
                    notifyIcon1.Icon = null;
                    notifyIcon1.Visible = false;
                }
            };
于 2012-03-18T15:34:40.970 に答える
0

場合によっては、Application_Exit イベントが数回発生することがあります。最終的には

if (notifyIcon != null)
{
    notifyIcon.Visible = false;
    notifyIcon.Dispose();
    notifyIcon = null;
}
于 2009-07-01T08:21:21.090 に答える