简体   繁体   中英

System Tray Icon

Okay firstly I just started C# so I'm not exactly the most skilled programmer out there. Okay so here's my problem that may seem stupid to you guys ;)

I have a simple enough app that a friend asked me to do. So far I have managed with a bit of Google but I'm stuck with this. The app runs fine and minimizes to the system tray and maximizes from the system tray which is good. However, when I open a second form from that application it creates another icon in the system tray and starts duplicating every time I open another form. So eventually I have lots of icons and all of them are seperate instances of the main form. System Tray events

private void notifyIcon_systemTray_MouseDoubleClick(object sender, MouseEventArgs e)
{
    if (FormWindowState.Minimized == WindowState)
    {
        Show();
        WindowState = FormWindowState.Normal;
    }
}
private void CronNecessityForm_Resize(object sender, EventArgs e)
{
    notifyIcon_systemTray.Visible = true;
    if (FormWindowState.Minimized == WindowState)
        Hide();

}
private void restoreContextMenuItem_Click(object sender, EventArgs e)
{
    Show();
    WindowState = FormWindowState.Normal;
}

To open the Form:

private void preferencesToolStripMenuItem_Click(object sender, EventArgs e)
{
    CronPreferences.formPreferences CronPreferences = new CronPreferences.formPreferences();
    CronPreferences.Show();
}

Close it:

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

How can I have all Forms map to the same icon in the System Tray?

You will need a single global tray icon that they all access. Do this by using a static variable that stays the same throughout different instances of the class.

Then, if you want to:

  • Open one form: keep a reference to the latest form in a variable and open it.
  • Open all minimised forms: iterate through each form and open them again.

If I got it right, you want to keep only a single instance of your application running. In that case, your title is a bit misleading since your problem has nothing to do with tray icons or multiple forms.

On the other hand, if you really have a main form in your app, which opens the second form (which creates a tray icon), in that case you simply need to make sure your second form is instantiated only once:

public class MainForm
{
    private SecondForm _secondForm;

    public void OpenSecondForm()
    {
         // create it only once
         if (_secondForm == null)
             _secondForm = new SecondForm();

         // otherwise just show it
         _secondForm.Show();
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM