2009-07-01 11 views
11

.NET 3.5 C#Winformsアプリがあります。このようなGUIはなく、ContextMenuを持つNotifyIconだけです。次のようにNotifyIconの問題がWinforms Appで消えていない

Iは、目に見える= falseにNotifyIconを設定しApplication_Exitイベントでそれを処分しようとした:

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

アプリ括弧内のコードに到達するが、ヌルREFをスローVisible = falseを設定しようとすると例外が発生します。

私はいくつかの場所を読んでフォームクロージングイベントに入れましたが、そのコードは決してヒットしませんでした(多分私はそのようなフォームを表示していませんか?)。

実際に動作するようにこのコードを入力することはできますか?私がそれを入れないと、あなたはマウスをその上に動かすまで、トレイに残っている残ったアイコンを手に入れます。

乾杯。私が気づいた余分

EDIT

だけで何か...........私はアプリでのClickOnceを使用してい

....... ..私がNotifyIconのContextMenuからアプリケーションを終了するだけで、例外は記録されません。

applicaitonはここにアップグレードするためにチェックした後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(); 
    } 
} 

は、このヘルプをしていますか?

答えて

3

前置きこのコードは私のために動作しますが、私はあなたが生きているアプリケーションを維持しているかわからないので...:

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(); 
    } 
} 
0

時々Application_Exitイベントが数回だけ入れ を上昇させることができますnotifyIcon = null;最後に

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

を働いていた、それはいくつかのApplication.Runを(持つことが可能ですので、今、私はそれについて考えることを、私は)このために、このイベントを使用しないことをお勧めします行くループさまざまなスレッドで実行され、Exitイベントがトリガーされるため、アイコンが早期に消える可能性があります。 –

+0

完全にあなたに同意します!私は自分のアプリケーションでこのイベントをクリーンアップの目的で使用しないことを好みます。しかし、なぜ「このコードが例外を投げるのか」という質問に対する最も単純な答えです。このコードを別の方法で設計する方法については、notifyIconの周りにラッパーの使い捨てクラスを作成することを提案して、notifyIconのライフタイムを制御します。 (新しいNotifyIconController()){Application.Run()}を使用して書き込みます。このようなもの –

3

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

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

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

_window.Closed += (s, e) => 
{ 
     if (_notifyIcon != null) 
     { 
      _notifyIcon.Visible = false; 
      _notifyIcon.Dispose(); 
      _notifyIcon = null; 
     } 
}; 
+0

On Window Closeイベント、それは私のために働いた。 App_Exitでは、notifyIconを破棄している間にエラーをスローします。 – Sunil

+1

ちょうど試しにキャッチして例外を無視してください。 –

11

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 
      } 
     } 
+0

Windows 8でも同じです。良いキャッチ:) – Ovais

+2

これは解決策です。ありがとう。 –

0

はあなたがまたnotifyIconを配置するnotifyIconを初期化しましたオブジェクトのDisposeメソッドをオーバーライドしたことがありますか?

protected override void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
     notifyIcon.Dispose(); 
     notifyIcon = null; 
    } 
    base.Dispose(disposing); 
} 
0

このコードは実際に私のため

this.Closed += (a, b) => 
      { 
       if (notifyIcon1 != null) 
       { 
        notifyIcon1.Dispose(); 
        notifyIcon1.Icon = null; 
        notifyIcon1.Visible = false; 
       } 
      }; 
関連する問題