C# NotifyIcon остается в трее после закрытия подсказки

После того, как подсказка Ballon Tip моего NotifyIcon была закрыта, значок все еще остается в трее. Он исчезает только при наведении курсора мыши.

У меня есть класс Notification.cs, который имеет один компонент - NotifyIcon.

Я звоню из моего Консольного приложения, так как хочу показывать уведомление только при выполнении определенных условий.

Некоторый код:

  • как я вызываю уведомление из моей программы:

    Notification not = new Notification("Error occured, do this or that", "Some error", System.Windows.Forms.ToolTipIcon.Error);
    not.getIcon().ShowBalloonTip(1000);
    
  • класс уведомлений:

    public Notification(string baloonTipText, string baloonTipTitle, System.Windows.Forms.ToolTipIcon icon) : this()
    {
        this.icon.Visible = true;
        this.icon.BalloonTipText = baloonTipText;
        this.icon.BalloonTipTitle = baloonTipTitle;
        this.icon.BalloonTipIcon = icon;
    }
    
    public System.Windows.Forms.NotifyIcon getIcon()
    {
        return this.icon;
    }
    
    private void icon_BalloonTipClosed(object sender, EventArgs e)
    {
        this.icon.Visible = false;
        this.icon.Dispose();            
    }
    

Есть идеи?

2 ответа

Решение

Поскольку вы работаете в консольном приложении, ваш icon_BalloonTipClosed Обработчик не будет вызываться, когда всплывающая подсказка закрыта (сообщение не отправлено). Вам нужно будет позвонить Dispose вручную либо при выходе из приложения, либо при установке таймера (System.Threading.Timer, System.Windows.Forms.Timer не будет работать) с тайм-аутом, более длительным, чем тайм-аут подсказки. например:

timer = new Timer(state => not.getIcon().Dispose(), null, 1200, Timeout.Infinite);
using System;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Reflection;
using System.Windows.Forms;

namespace ShowToolTip
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btBallonToolTip_Click(object sender, EventArgs e)
        {
            ShowBalloonTip();
            this.Hide();
        }

        private void ShowBalloonTip()
        {
            Container bpcomponents = new Container();
            ContextMenu contextMenu1 = new ContextMenu();

            MenuItem runMenu = new MenuItem();
            runMenu.Index = 1;
            runMenu.Text = "Run...";
            runMenu.Click += new EventHandler(runMenu_Click);

            MenuItem breakMenu = new MenuItem();
            breakMenu.Index = 2;
            breakMenu.Text = "-------------";

            MenuItem exitMenu = new MenuItem();
            exitMenu.Index = 3;
            exitMenu.Text = "E&xit";

            exitMenu.Click += new EventHandler(exitMenu_Click);

            // Initialize contextMenu1
            contextMenu1.MenuItems.AddRange(
                        new System.Windows.Forms.MenuItem[] { runMenu, breakMenu, exitMenu });

            // Initialize menuItem1

            this.ClientSize = new System.Drawing.Size(0, 0);
            this.Text = "Ballon Tootip Example";

            // Create the NotifyIcon.
            NotifyIcon notifyIcon = new NotifyIcon(bpcomponents);

            // The Icon property sets the icon that will appear
            // in the systray for this application.
            string iconPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\setup-icon.ico";
            notifyIcon.Icon = new Icon(iconPath);

            // The ContextMenu property sets the menu that will
            // appear when the systray icon is right clicked.
            notifyIcon.ContextMenu = contextMenu1;

            notifyIcon.Visible = true;

            // The Text property sets the text that will be displayed,
            // in a tooltip, when the mouse hovers over the systray icon.
            notifyIcon.Text = "Morgan Tech Space BallonTip Running...";
            notifyIcon.BalloonTipText = "Morgan Tech Space BallonTip Running...";
            notifyIcon.BalloonTipTitle = "Morgan Tech Space";
            notifyIcon.ShowBalloonTip(1000);
        }

        void exitMenu_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        void runMenu_Click(object sender, EventArgs e)
        {
            MessageBox.Show("BallonTip is Running....");
        }
    }
}
Другие вопросы по тегам