свернуть приложение в системный трей - PullRequest
105 голосов
/ 02 октября 2011

У меня есть приложение для форм Windows, работающее на C # и Visual Studio 2010.

Как я могу свернуть свое приложение в системный трей (не на панель задач), а затем вернуть его обратно, если дважды щелкнуть в системном трее?любая идея?Кроме того, как я могу сделать какое-то меню на значке в системном трее, и когда я щелкаю по нему правой кнопкой мыши, оно показывает меню, такие как Вход, Отключить, Подключить, что-то вроде этого.Кроме того, есть ли какие-либо методы, чтобы показать, как шарик выскакивает из системного трея?

PS: я уже добавил notifyIcon, но я не знаю, как его использовать.

Ответы [ 9 ]

145 голосов
/ 02 октября 2011

Ручкасобытие Resize формы.В этом обработчике вы переопределяете базовую функциональность события Resize, чтобы форма свернулась в системный трей, а не на панель задач.Это можно сделать, выполнив следующие действия в обработчике события Resize формы: Проверьте, не установлено ли для свойства WindowState формы значение FormWindowState.Minimized.Если да, скройте свою форму, включите объект NotifyIcon и покажите всплывающую подсказку, которая отображает некоторую информацию.Как только WindowState станет FormWindowState.Normal, отключите объект NotifyIcon, установив для его свойства Visible значение false.Теперь вы хотите, чтобы окно снова появлялось при двойном щелчке по объекту NotifyIcon на панели задач.Для этого обработайте событие MouseDoubleClick NotifyIcon.Здесь вы показываете форму, используя метод Show ().

private void frmMain_Resize(object sender, EventArgs e)
{
    if (FormWindowState.Minimized == this.WindowState)
    {
       mynotifyicon.Visible = true;
       mynotifyicon.ShowBalloonTip(500);
       this.Hide();
    }

    else if (FormWindowState.Normal == this.WindowState)
    {
       mynotifyicon.Visible = false;
    }
}
69 голосов
/ 23 апреля 2013

Я нашел это, чтобы выполнить все решение. Ответ выше не удаляет окно из панели задач.

private void ImportStatusForm_Resize(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Minimized)
    {
        notifyIcon.Visible = true;
        notifyIcon.ShowBalloonTip(3000);
        this.ShowInTaskbar = false;
    }
}

private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
    this.WindowState = FormWindowState.Normal;
    this.ShowInTaskbar = true;
    notifyIcon.Visible = false;
}

Также полезно установить следующие свойства элемента управления значком уведомлений с помощью дизайнера форм.

this.notifyIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info; //Shows the info icon so the user doesn't think there is an error.
this.notifyIcon.BalloonTipText = "[Balloon Text when Minimized]";
this.notifyIcon.BalloonTipTitle = "[Balloon Title when Minimized]";
this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon"))); //The tray icon to use
this.notifyIcon.Text = "[Message shown when hovering over tray icon]";
17 голосов
/ 21 мая 2014

Я бы пошел с

private void Form1_Resize(object sender, EventArgs e)
{
     if (FormWindowState.Minimized == this.WindowState)
     {
          notifyIcon1.Visible = true;
          notifyIcon1.ShowBalloonTip(500);
          this.Hide();    
     }
     else if (FormWindowState.Normal == this.WindowState)
     {
          notifyIcon1.Visible = false;
     }
}

private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
{
     this.Show();
     this.WindowState = FormWindowState.Normal;
}
16 голосов
/ 29 июня 2014

не забудьте добавить файл значков в ваш notifyIcon, иначе он не появится в трее.

12 голосов
/ 06 июня 2014

попробуйте

 private void Form1_Load(object sender, EventArgs e)
    {
        notifyIcon1.BalloonTipText = "Application Minimized.";
        notifyIcon1.BalloonTipTitle = "test";
    }

    private void Form1_Resize(object sender, EventArgs e)
    {
        if (WindowState == FormWindowState.Minimized)
        {
            ShowInTaskbar = false;
            notifyIcon1.Visible = true;
            notifyIcon1.ShowBalloonTip(1000);
        }
    }

    private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        ShowInTaskbar = true;
        notifyIcon1.Visible = false;
        WindowState = FormWindowState.Normal;
    }
3 голосов
/ 08 апреля 2016

Это метод, который я использую в своих приложениях, он довольно прост и не требует пояснений, но я с удовольствием предоставлю более подробную информацию в ответ на ваши комментарии.

1 голос
/ 13 марта 2015

... и для вашего меню уведомлений правой кнопкой мыши добавьте в форму контекстное меню, отредактируйте его и установите события щелчка мышью для каждого из контекстных меню, дважды щелкнув их, а затем прикрепите его к notifyicon1, выбрав ContextMenuStrip в свойстве notifyicon.

1 голос
/ 19 августа 2014

При нажатии на изображение в системном трее, вы можете проверить, видна ли рамка, а затем вам нужно установить Visible = true или false

0 голосов
/ 19 сентября 2018

this.WindowState = FormWindowState.Minimized;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...