Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Changing System Tray Icon Image

I have built a Tray Application in .Net which works fine. However, users want to change Tray Icon image at runtime on certain conditions. To make it simple, let us say, something is not working - Tray Icon should show Red image; if everything is fine, it should show green. I'm not sure how to achieve this in .Net.

Please provide some inputs on this. Thanks

I built CustomApplicationContent for Tray. Some snippets below:

Program.cs

[STAThread]
    static void Main()
    {
        if (!SingleInstance.Start()) { return; }
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        try
        {
            var applicationContext = new CustomApplicationContext();
            Application.Run(applicationContext);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Program Terminated Unexpectedly",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        SingleInstance.Stop();
    }

CustomApplicationContext.cs

public class CustomApplicationContext : ApplicationContext
{
    private System.ComponentModel.IContainer components;    // a list of components to dispose when the context is disposed
    private NotifyIcon notifyIcon;
    private static readonly string IconFileName = "green.ico";
    private static readonly string DefaultTooltip = "Employee Management System";
    private readonly TrayManager trayManager;

    public CustomApplicationContext()
    {
        InitializeContext();
        trayManager = new TrayManager(notifyIcon);
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing && components != null) { components.Dispose(); }
    }


    private void InitializeContext()
    {
        components = new System.ComponentModel.Container();
        notifyIcon = new NotifyIcon(components)
        {
            ContextMenuStrip = new ContextMenuStrip(),
            Icon = new Icon(IconFileName),
            Text = DefaultTooltip,
            Visible = true
        };
        notifyIcon.ContextMenuStrip.Opening += ContextMenuStrip_Opening;
        notifyIcon.DoubleClick += notifyIcon_DoubleClick;
        //notifyIcon.MouseUp += notifyIcon_MouseUp;
    }
private void notifyIcon_DoubleClick(object sender, EventArgs e)
    {
        ShowAboutForm();
    }
private TestForm testForm;

    private void ShowAboutForm()
    {
        if (testForm == null)
        {
            testForm = new TestForm { trayManager = trayManager };
            testForm.Closed += testForm_Closed; ; // avoid reshowing a disposed form
            testForm.Show();
        }
        else { testForm.Activate(); }
    }


    void testForm_Closed(object sender, EventArgs e)
    {
        testForm = null;
    }

Where do I add timer - in Context? Users may not open a form so adding timer on Form may not work all the time. How do I change icon?

like image 904
techspider Avatar asked Nov 29 '22 14:11

techspider


2 Answers

You can add 2 Icons to Resource.resx file of your project, Red.ico and Green.ico and use them this way in different situations:

this.notifyIcon1.Icon = Properties.Resources.Red;

or

this.notifyIcon1.Icon = Properties.Resources.Green;

To add icons to Resourse.resx, Open Resources.resx from Properties folder of your project.then From first dropdown in toolbar of designer, select Icons, and from the next dropdown select Add Existing File...and add your icon files. You can also rename items here.

enter image description here enter image description here

like image 66
Reza Aghaei Avatar answered Dec 12 '22 00:12

Reza Aghaei


I'd make your Icons Embedded Resources, then use code like this to change the currently displayed one at run-time:

notifyIcon.Icon = new Icon(this.GetType(), "red.ico");
like image 44
Idle_Mind Avatar answered Dec 12 '22 02:12

Idle_Mind