代码之家  ›  专栏  ›  技术社区  ›  Malfist

如何防止退出时在系统托盘中留下图标?

  •  14
  • Malfist  · 技术社区  · 15 年前

    我的程序会在系统托盘中放置一个图标,因为用户可能会将其最小化。但是,如果应用程序崩溃,或者我阻止应用程序在VS中运行,它会留下图标,直到我用鼠标悬停在它上面。有时候我会往下看,那里会有10个左右的图标。

    我可以确定图标消失了吗?

    5 回复  |  直到 9 年前
        1
  •  21
  •   JSBÕ±Õ¸Õ£Õ¹    15 年前

    没有办法做到这一点。Windows不会轮询您的程序以查看它是否仍然存在。因此,您的图标将一直保留在系统托盘中,直到您告诉它离开(正常退出),或者用户执行一些操作来启动对您的程序的调用(如mouseover)。只有这样,shell才会知道您的程序已经停止运行,它需要清理您的图标。

        2
  •  4
  •   Mordachai    15 年前

    您有几个选项:

    1)编写一个根结构异常处理程序,确保在退出前销毁图标。这需要一些努力-但您基本上可以将自己未处理的异常处理程序添加到Windows中,在许多形式的“boom”中都会调用该异常处理程序,这样您就有了一些最后的清理机会。

    2)编写一个监视应用程序,它休眠在主进程句柄上,并在图标唤醒时(主应用程序已停止)将其杀死。为了使后一种方案能够很好地工作,您可能希望主进程不杀死图标本身-或者您可以创建一种方法来告诉监视器应用程序它应该退出而不销毁图标(让监视器应用程序在进程句柄和命名事件上都休眠-如果被事件唤醒,那么它只会死而不在MA之后清除。在应用程序中)。

        3
  •  3
  •   driis    15 年前

    退出之前,请将NotifyIcon Visible属性设置为false。

        4
  •  3
  •   BFree    15 年前

    您需要在NotifyIcon上调用Dispose,它才能离开托盘。

    编辑:你可以在你的program.cs中加入一个事件。对于所有的Windows应用程序,您都将拥有如下功能:

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    

    应用程序类有几个事件,您可以利用这些事件来了解应用程序何时死亡:

            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
            Application.ApplicationExit += new EventHandler(Application_ApplicationExit);
    
        5
  •  -1
  •   Borys Shobat    9 年前

    我们可以在表格关闭前隐藏trayicon。 添加窗体关闭事件

    NotifyIcon ni;
    ...
    ...
    private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
    {
         ni.Visible = false;
    }
    
    推荐文章