c# - 优雅地关闭系统托盘应用程序

标签 c# .net winforms

我有一个非常基本的应用程序,它在系统托盘(通知区域)中运行。 Main 方法如下所示:

using (NotifyIcon notifyIcon = new NotifyIcon())
{
    notifyIcon.ContextMenuStrip = new ContextMenuStrip();
    notifyIcon.ContextMenuStrip.Items.Add(new ToolStripMenuItem(
        "Exit", 
        null, 
        delegate { App.Exit(); }
        )
    );

    notifyIcon.Icon = Properties.Resources.MyIcon;
    notifyIcon.Visible = true;

    Application.Run();
}

到目前为止一切正常(我可以使用上下文菜单中的“退出”选项并且应用程序正确退出。但是,我需要在卸载软件时退出应用程序。现在我正在使用 taskkill 从我的 WiX 安装程序执行此操作(也许有更好的方法?)。问题是,如果我执行 taskkill/im myapp.exe,通知区域中的图标会消失,但进程仍在运行。如果我用 taskkill/f/im myapp.exe 强行关闭它,则进程结束但图标仍然存在(直到我将鼠标悬停在它上面)。有没有办法删除图标并从单独的进程中结束进程?

最佳答案

向您的应用程序添加隐藏表单。它将成为 Application.Run() 的参数。当表单关闭时,您的应用程序将退出。

为了让表单在 WiX 中关闭,我们使用一个 util:CloseApplication 1 CloseMessage 属性设置为 true。

关于c# - 优雅地关闭系统托盘应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16042763/

相关文章:

c# - C# 打印中的换页

.net - 如何覆盖 WinForms 中数据绑定(bind)控件上的错误消息?

c# - 为什么总是需要在具有 IDisposable 成员的对象上实现 IDisposable?

c# - 实体类型 ApplicationUser 不是当前上下文模型的一部分,具有自定义用户存储的 DB First

.net - Windows CE 中跨进程通信的最佳机制是什么?

c# - 是否有 IDictionary 实现在缺少键时返回默认值而不是抛出?

c# - Winforms 静态 HandleCreated 或 OnLoad 事件

c# - 在 Linq 中发出对象 where 子句 : the condition is bypassed

c# - 是否必须提供与C#中的多线程相关的事件的场景?

c# - 什么更快 : web service or XML server output?