85

SOには同じ疑問を投げかける多くの質問があります。これに対する解決策は、設定することです

notifyIcon.icon = nullDisposeFormClosing イベントでそれを呼び出します。

私のアプリケーションでは、そのようなフォームはありませんが、イベントで更新される通知アイコンがあります。作成時に、フォームを非表示にしてShowInTaskbarプロパティを作成しますfalse。したがって、「FormClosing」または「FormClosed」イベントを持つことはできません。

このアプリケーションが exit するイベントを取得すると、exit を呼び出しProcess.GetCurrentProcess().Kill();ます。

殺す前に破棄するだけでなく追加notifyIcon.icon = nullしましたが、マウスをその上に置くまでアイコンはタスクバーのままです。

編集:この動作が呼び出しによるものであると仮定するとGetCurrentProcess().Kill()、すべてのリソースをクリアしてシステムトレイからアイコンを削除するアプリケーションを終了するエレガントな方法はありますか?

4

15 に答える 15

20

私にとってうまくいった唯一の解決策は、Closed イベントを使用して、アイコンを非表示にして破棄することでした。

icon.BalloonTipClosed += (sender, e) => { 
                                            var thisIcon = (NotifyIcon)sender;
                                            thisIcon.Visible = false;
                                            thisIcon.Dispose(); 
                                        };
于 2016-05-25T18:17:48.707 に答える
13

終了または閉じるボタンを押したときに実行する場合は、次のコードを使用します。

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();
于 2015-05-30T10:09:21.500 に答える
3

残念ながら、これは正常な動作です。これは、Windows の仕組みによるものです。あなたは本当にそれについて何でもすることができます。

いくつかの提案については、Winforms アプリで NotifyIcon が消えない問題を参照してください。

アプリケーションの終了時に通知アイコンがシステム トレイに残るも参照してください。

Microsoft は、Microsoft Connect でこれを「修正しない」とマークしています。

于 2013-02-06T07:38:35.393 に答える
2

Application.DoEvents();に設定notifyIcon.Iconして破棄した後に試してくださいnull

notifyIcon.Icon = null;
notifyIcon.Dispose();
Application.DoEvents();

Environment.Exit(0);の代わりに検討してProcess.GetCurrentProcess().Kill()ください。

于 2015-02-14T00:59:59.563 に答える
2

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();
}
于 2014-03-22T21:42:59.013 に答える
0

私はあなたとまったく同じ問題を抱えていました。

適切な方法は、WM_CLOSE メッセージをプロセスに送信することです。
この記事で見つけた c# コードを使用します。
http://social.msdn.microsoft.com/Forums/vstudio/en-US/82992842-80eb-43c8-a9e6-0a6a1d19b00f/terminating-a-process-in-a-friendly-way

于 2013-06-28T08:10:37.250 に答える