SOに同じ疑問を投げかける多くの質問があります。これに対する解決策は、
_notifyIcon.icon = null
_およびFormClosingイベントでDispose
を呼び出します。
私のアプリケーションでは、そのようなフォームはありませんが、イベントで更新される通知アイコンがあります。作成時に、フォームを非表示にしてShowInTaskbar
プロパティfalse
を作成します。したがって、「FormClosing」イベントまたは「FormClosed」イベントを持つことはできません。
このアプリケーションが終了するイベントを取得すると、Process.GetCurrentProcess().Kill();
を呼び出して終了します。
殺す前に_notifyIcon.icon = null
_とDisposeを追加しましたが、マウスをその上にホバーするまでアイコンはタスクバーのままです。
[〜#〜] edit [〜#〜]:この動作がGetCurrentProcess().Kill()
の呼び出しによるものであると仮定した場合、すべてをクリアするアプリケーションを終了するエレガントな方法はありますかリソースを削除し、システムトレイからアイコンを削除します。
どちらかを設定できます
notifyIcon1.Visible = false;
OR
notifyIcon.Icon = null;
フォームを閉じるイベントで。
私のために働いた唯一の解決策は、Closedイベントを使用し、アイコンを非表示にして破棄することでした。
icon.BalloonTipClosed += (sender, e) => {
var thisIcon = (NotifyIcon)sender;
thisIcon.Visible = false;
thisIcon.Dispose();
};
つかいます notifyIcon.Visible = False
in FormClosing
イベント
コンポーネントは次のように正しい順序で配置する必要があります。
NotifyIcon.Icon.Dispose();
NotifyIcon.Dispose();
これをMainWindow
クロージングイベントに追加します。
これが役立つことを願っています。
[終了]または[閉じる]ボタンを押したときに、このコードを実行する場合に使用します。
private void ExitButton_Click(object sender, EventArgs e)
{
notifyIcon.Dispose;
Application.Exit(); // or this.Close();
}
フォームが閉じているときに実行したい場合は、このコードを使用します。
private void Form1_FormClosing(object sender, EventArgs e)
{
notifyIcon.Dispose;
Application.Exit(); // or this.Close();
}
重要なコードは次のとおりです。
notifyIcon.Dispose;
残念ながら、これは通常の動作です。これは、Windowsの動作方法によるものです。あなたはそれについて本当に何でもすることができます。
WinformsアプリでNotifyIconが消えない問題 を参照してください。
アプリケーションの終了時に通知アイコンがシステムトレイに残る も参照してください。
Microsoftは、Microsoft Connectでこれを「修正しない」とマークしました。
WPFには独自のNotifyIconがないと思いますか?サードパーティのHarcodet.Wpf.TaskbarNotificationを使用している場合は、これを試してください。
ウィンドウが閉じられた(バックグラウンドで実行される)ときにアプリが閉じないようにするために、ウィンドウを閉じる(右上の[x]ボタンを押す)ロジックを分離し、実際に(コンテキストメニューを使用して)シャットダウンします。これを機能させるには、コンテキストメニューに_isExplicitClose
trueに。それ以外の場合は、ウィンドウを非表示にして実行を継続します。
これは、明示的に閉じると、閉じる前にトレイアイコンとフォームを非表示にします。この方法では、アプリケーションがシャットダウンされた後、アイコンがぶら下がることはありません。
private bool _isExplicitClose;
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
base.OnClosing(e);
if (!_isExplicitClose)
{
e.Cancel = true;
Hide();
}
}
protected void QuitService(object sender, RoutedEventArgs e)
{
_isExplicitClose = true;
TaskbarIcon.Visibility = Visibility.Hidden;
Close();
}
_notifyIcon.Icon
_をnull
に設定して破棄した後、Application.DoEvents();
を試してください:
_notifyIcon.Icon = null;
notifyIcon.Dispose();
Application.DoEvents();
_
Environment.Exit(0);
ではなくProcess.GetCurrentProcess().Kill()
を検討してください。
私はこれらすべてを試しましたが、どれも私のために働きませんでした。しばらく考えた後、「バルーン」を作成するアプリケーションが実際にバルーンを廃棄する前に終了していることに気付きました。 Application.Exit()
コマンドを含むApplication.DoEvents()
の直前にwhileループを追加しました。これにより、私のNotifyIcon1_BalloonTipClosed
終了する前にアイコンの破棄を実際に完了します。
while (notifyIcon1.Visible)
{
Application.DoEvents();
}
Application.Exit();
そして、tip closedメソッド:(thisIcon.visible = false
これが機能するために)
private void NotifyIcon1_BalloonTipClosed(object sender, EventArgs e)
{
var thisIcon = (NotifyIcon)sender;
thisIcon.Icon = null;
thisIcon.Visible = false;
thisIcon.Dispose();
}
.dispose()メソッドを使用するだけで問題を解決できると言えますが、アプリケーションを終了する代わりにプロセスを強制終了する場合は呼び出されません。
Application.Exit を参照してください。単純なWindowsフォームアプリケーションを作成した場合は、 Environment.Exit を参照してください。
私はあなたとまったく同じ問題を抱えていました。
適切な方法は、プロセスにWM_CLOSEメッセージを送信することです。
この記事で見つけたc#コードを使用します。
http://social.msdn.Microsoft.com/Forums/vstudio/en-US/82992842-80eb-43c8-a9e6-0a6a1d19b00f/terminating-a-process-in-a-friendly -way
正しい答えはすでに与えられています。ただし、たとえばタイマーを使用して、遅延も提供する必要があります。その場合のみ、アプリケーションはバックグラウンドでアイコンを削除できます。
private System.Windows.Forms.Timer mCloseAppTimer;
private void ExitButton_Click(object sender, EventArgs e)
{
notifyIcon.Visible = false; notifyIcon.Dispose;
mCloseAppTimer = new System.Windows.Forms.Timer();
mCloseAppTimer.Interval = 100;
mCloseAppTimer.Tick += new EventHandler(OnCloseAppTimerTick);
}
private void OnCloseAppTimerTick(object sender, EventArgs e)
{
Environment.Exit(0); // other exit codes are also possible
}
以下のように... Designer.csのコードを編集します。
protected override void Dispose(bool disposing)
{
if (disposing )
{
this.notifyicon.Dispose();
}
base.Dispose(disposing);
}